web-dev-qa-db-ja.com

AndroidでのApache Commons Codec:メソッドが見つかりませんでした

今日、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で拒否

この問題を解決する方法についての手がかりはありますか?どうもありがとう。

46
dqminh

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('/','_');

お役に立てば幸いです!

57
Pablo Fernandez

Apache commonsを使用する必要はありません。Android代わりに Android.util.Base64 を使用できます。

16
Mootaz Dinana

私はまったく同じ問題を経験しました。そこでAndroidのソースコードを参照し始めました。その結果、org.Apache.commons.code.binaryの実装を持つAndroidについてのPablo Fernandezの推測が正しいことがわかりました。ただし、バージョン1.4または1.5ではなく、Apache commonsのバージョン1.2です。 Android source で自分自身を確認できます。

注として、これは質問です この投稿の複製です

12
zarthross

次の機能を使用できます。

private static String encodeBase64URLSafeString(byte[] binaryData) {

        return Android.util.Base64.encodeToString(binaryData, Base64.URL_SAFE);

    }

ソース+他の可能なフラグのリスト: http://developer.Android.com/reference/Android/util/Base64.html

9
RWIL

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で失敗しました...

4
R. Simac

この回答は、上記のコメントの 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;
    }
2
Martin Pfeffer

これは古い質問であることを知っていましたが、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/

0
pringi

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として生成するか、ソースコードをインポートしてパッケージ名を変更してください。

0
user3125139