今日、Apache.commons.codecパッケージをAndroidアプリケーションに含めてみましたが、実行できませんでした。Androidメソッドord.Apacheが見つかりませんでした。 commons.codec.binary。*およびDDMSで次のエラーを出力します
01-12 08:41:48.161:エラー/ dalvikvm(457):メソッドcom.dqminh.app.util.Util.sendRequestから参照されているメソッドorg.Apache.commons.codec.binary.Base64.encodeBase64URLSafeStringが見つかりませんでした
01-12 08:41:48.161:WARN/dalvikvm(457):VFY:静的メソッドを解決できません10146:Lorg/Apache/commons/codec/binary/Base64; .encodeBase64URLSafeString([B)Ljava/lang/String;
01-12 08:41:48.161:WARN/dalvikvm(457):VFY:オペコード0x71を0x0004で拒否
この問題を解決する方法についての手がかりはありますか?どうもありがとう。
Android with OAuth library を使用中に同様の問題が発生しました。
また、Android、クラスパスにApache.commons.codec
を含めたにもかかわらず、特定のメソッド(encodeBase64String
)が見つかりませんでした。
Javadocsをチェックすると、両方のメソッドは1.4以上であると主張していますので、私の推測ではAndroidにはすでにこれらのメソッドが実際に未定義である古いバージョンのcommons.codec
.
私の解決策は、次のような古い方法を使用することでした:
String encodedString = new String(Base64.encodeBase64('string to encode'));
+と/をURLセーフな値-と_に置き換えるため、使用する方法は異なります。したがって、おそらく次のようなものを使用できます。
String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');
お役に立てば幸いです!
Apache commonsを使用する必要はありません。Android代わりに Android.util.Base64 を使用できます。
次の機能を使用できます。
private static String encodeBase64URLSafeString(byte[] binaryData) {
return Android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
ソース+他の可能なフラグのリスト: http://developer.Android.com/reference/Android/util/Base64.html
Apacheライブラリからこのコードビットをコピーするだけです(かなり分離されています) http://www.Java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/Apache/commons/codec/binary/Base64.Java.htm
編集:オリジナルがなくなったため、Wayback Machineからのリンクを更新しました: http://web.archive.org/web/20130610025148/ http://www.Java2s.com/Open-Source/Android/Blog-Twitter/twitspeak/org/Apache/commons/codec/binary/Base64.Java.htm
同じ問題に対する私の解決策は、問題のあるクラスorg.Apache.commons.codec.binary.Base64.Java
の名前をorg.Apache.commons.codec.binary.ApacheBase64.Java
に変更することでした。 Eclipse refactor-renameを使用して行いました。
このようにして、最新かつ最高のApacheソリューションが保存および使用され、最終的に私のアプリがAndroid 1.6の最低の分母から引き上げられたときに偶発的な問題が再発する可能性はありません。
注:Javaプロジェクトの隣に、Apacheコモンズソースツリー全体が個別のEclipse Androidプロジェクトとして既に設定されていることに注意してください。私のAndroidプロジェクトはApache Commonsクラスの多くを使用しましたが、上記の問題のためにBase64で失敗しました...
この回答は、上記のコメントの Dylan Watson によって行われたことに注意してください。
Base64.encode( "foobar" .getBytes()、Base64.Base64.NO_WRAP);を使用する必要があることに注意してください。 Apache commonsライブラリとまったく同じ結果を得るため。参照:stackoverflow.com/questions/17912119
この答えは、私のAndroidアプリとJava "デスクトップ"アプリを通信しようとした数時間後に働いた唯一の答えでした。
だから、ここにいくつかのソースコードがあります、多分それは他の人を助けるでしょう:
デスクトップアプレットのコード:
private static String convertToBase64(String s) {
byte[] bytes = new byte[0];
try {
bytes = (s.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return DatatypeConverter.printBase64Binary(bytes);
}
このスニペットはAndroidアプリで使用されます:
public static String convertToBase64(String password) {
byte[] bPwd = new byte[0];
try {
bPwd = (password.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
try {
password = new String(Base64.encode(bPwd, Base64.NO_WRAP), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return password;
}
これは古い質問であることを知っていましたが、APIレベル23でコンパイルするときにこの問題に最近直面し、問題の別の解決策を見つけました:useguavaプロジェクト。
// Encoding
String encodedString = BaseEncoding.base64().encode(text.getBytes(UTF_8));
System.out.println("encodedString: " + encodedString);
// Decoding
byte[] decodedString = BaseEncoding.base64().decode(encodedString);
System.out.println("decodedString: " + new String(decodedString, UTF_8));
Guavaライブラリ(18.0)は私が使用したバージョンであり、変更はスムーズでした。コードは期待どおりに機能します。
ここにある解決策: https://memorynotfound.com/encode-decode-base64-string-using-native-Java/
apache commons project libを含めましたか?
org.Apache.commons:commons-compress
org.Apache.commons:commons-email
org.Apache.commons:commons-io
org.Apache.commons:commons-lang3
org.Apache.commons:commons-parent
org.Apache.commons:commons-pool2
commons-codecのGAVは
commons-codec:commons-codec
しかし、それはパッケージ名です
org.Apache.commons.codec
このパッケージ名は、Apache commonsプロジェクトライブラリと競合します。commons-codecのパッケージ名を変更してから、jarとして生成するか、ソースコードをインポートしてパッケージ名を変更してください。