Apache CommonsコーデックとのAndroid:な方法
-
20-09-2019 - |
質問
本日の私のためにapache.公共財です。コーデックのパッケージは私のAndroidアプリケーション思います。Androidな方法ord.apache.公共財です。コーデック.バイナリー.* 出力は以下の誤りDDMS
01-12 08:41:48.161:エラー/dalvikvm(457):な方法です。apache.公共財です。コーデック.バイナリー.Base64.encodeBase64URLSafeString参照されているから法com.dqminh.アプリです。util.Util.sendRequest
01-12 08:41:48.161:WARN/dalvikvm(457):VFY:な解決法10146:Lorg/apache/commons/コーデック/バイナリ/Base64;.encodeBase64URLSafeString([B)Ljava/lang/文字列;
01-12 08:41:48.161:WARN/dalvikvm(457):VFY:拒否するopcode0x71で0x0004
何かうことがあります。よろしくおねがいします!
他のヒント
私は正確に同じ問題を経験しました。だから私はアンドロイドのソースコードを閲覧し始め、それが結局のところAndroidはorg.apache.commons.code.binaryの実装を持っていることについてパブロ・フェルナンデスの推測は正しいです。しかし、Apacheのコモンズのそのバージョン1.2ではなく、バージョン1.4、あるいは1.5。 あなたはアンドロイド<のhref = "https://android.googlesource.com/platform/external/apache-http/+/master/src/org/apache/commons/codec/binary/Base64にあなたの自己のために見ることができます。 Javaの」のrel = "nofollowをnoreferrer">ソースでます。
メモとしてこれは問題です。
このポストにはの複製でありますあなたは、次の機能を使用することができます:
private static String encodeBase64URLSafeString(byte[] binaryData) {
return android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);
}
ソース+他の可能なフラグのリスト: http://developer.android.com/reference/android /util/Base64.htmlする
同じ問題に私のソリューションは、org.apache.commons.codec.binary.Base64.java
に問題のあるクラスorg.apache.commons.codec.binary.ApacheBase64.java
の名前を変更することでした。私は、Eclipseのリファクタリング、名前の変更を使用してそれをやっています。
そのように、最新かつ最高のapache溶液が保存され、使用され、私のアプリは、最終的にアンドロイド1.6最低分母から持ち上げているときに偶然の問題再発の見込みはありません。
私は次の私のAndroidのプロジェクトに、すでに別のEclipseのJavaプロジェクトとして設定し、全体のApache Commonsのソースツリーを持っています。私のAndroidのプロジェクトは、Apache Commonsのクラスの多くを使用しますが、上記の問題点を説明しているためにBase64で失敗しました...
きのコピーこのコードデッキがバラバラに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
この回答は次の者によって行われたことに注意してください。 ディラン・ワトソン 上のコメントで:
base64.encode( "foobar" .getBytes()、base64.base64.no_wrap)を使用する必要があることに注意してください。Apache Commons Libraryとまったく同じ結果を得るため。見る: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);
}
このスニペットは、 アンドロイドアプリ:
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;
}
は、
のようにApache Commonsプロジェクトの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
コモンズ・コーデックのGAVがある
commons-codec:commons-codec
しかし、それのパッケージ名は
org.apache.commons.codec
このパッケージ名は、Apache Commonsプロジェクトのlibsにとの競合になり、jarファイルとしてそれを生成するか、ソースコードがパッケージ名を変更したインポートし、コモンズ・コーデックのパッケージ名を変更しよう;
これは古い質問であることはわかっていますが、最近 API レベルでコンパイルするときにこの問題に直面しました 23, 、問題に対する別の解決策を見つけました。使用 グアバ プロジェクト。
// 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));
グアバ ライブラリ (18.0)は私が使用していたバージョンでしたが、変更はスムーズでした。コードは期待どおりに機能します。
解決策はここにあります: https://memorynotfound.com/encode-decode-base64-string-using-native-java/
これは私のために動作します:
import org.apache.commons.codec.binary.Base64;
/**
* This is used to get the base64 from the bytes
*
* @param rawBytes the raw bytes
* @return the base64 encoded string
*/
public static String getBase64String(byte[] rawBytes) {
String base64Str = "";
if (rawBytes!= null) {
base64Str= new String(Base64.encodeBase64(rawBytes));
}
return base64Str;
}
public static byte[] getBase64DecodedString(String base64EncodedStr) {
byte[] base64Bytes = Base64.decodeBase64(base64EncodedStr.getBytes());
return bitmap;
}