51

今日、Android アプリケーションに apache.commons.codec パッケージを含めようとしましたが、実行できませんでした。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 で拒否

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

4

11 に答える 11

63

私が開発中のOAuth ライブラリで Android を使用しているときに、同様の問題が発生しました。

apache.commons.codecまた、クラスパスに含めたにもかかわらず、特定のメソッド ( encodeBase64String) が見つからないことを android から取得しました。

javadocs を確認すると、両方のメソッドが1.4 以上のみであるとcommons.codec主張しているため、Android にはこれらのメソッドが実際に定義されていない古いバージョンが既に含まれていると思います。

私の解決策は、次のような古い方法を使用することでした。

String encodedString = new String(Base64.encodeBase64('string to encode'));

+ と / を URL セーフな値 - と _ に置き換えるため、使用するメソッドは異なります。したがって、おそらく次のようなものを使用できます。

String encodedString = new String(Base64.encodeBase64('string to encode'));
String safeString = encodedString.replace('+','-').replace('/','_');

それが役立つことを願っています!

于 2010-03-28T16:10:06.550 に答える
18

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

于 2012-07-07T07:39:46.587 に答える
13

まったく同じ問題が発生しました。だから私はAndroidのソースコードを閲覧し始めました.Androidがorg.apache.commons.code.binaryの実装を持っているというPablo Fernandezの推測は正しいことがわかりました。ただし、バージョン 1.4 や 1.5 ではなく、Apache Commons のバージョン 1.2 です。あなたはアンドロイドソースであなた自身のために見ることができます.

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

于 2011-05-05T18:10:08.977 に答える
5

同じ問題に対する私の解決策は、問題のあるクラスの名前を に変更することでしorg.apache.commons.codec.binary.Base64.javaorg.apache.commons.codec.binary.ApacheBase64.java。Eclipse refactor-rename を使用して実行しました。

そうすれば、最新かつ最高の apache ソリューションが保持されて使用され、私のアプリが最終的に android 1.6 の最小分母から持ち上げられたときに、偶発的な問題の再発の可能性はありません。

Android プロジェクトの隣に、Apache Commons ソース ツリー全体が別の Eclipse Java プロジェクトとして既に設定されていることに注意してください。私の Android プロジェクトは多くの Apache Commons クラスを使用しましたが、上記の問題により Base64 で失敗しました...

于 2011-11-27T16:44:44.617 に答える
3

この回答は、上記のコメントでディラン・ワトソンによって作成されたことに注意してください。

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;
    }
于 2015-04-03T01:55:48.710 に答える
0

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

于 2016-12-23T05:12:49.767 に答える
0

これは古い質問であることを知っていますが、最近 API レベル23用にコンパイルするときにこの問題に直面し、問題の別の解決策を見つけました: guavaプロジェクトを使用します。

// 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/

于 2018-02-07T09:23:10.003 に答える