2010-01-12 106 views
40

今天我嘗試了在我的Android應用程序中包含apache.commons.codec包,但無法啓動它。安卓找不到方法ord.apache.commons.codec.binary *和輸出DDMSApache Commons Codec與Android:找不到方法

以下錯誤

八月一日至12日:41:48.161:ERROR/dalvikvm(457):找不到方法組織.apache.commons.codec.binary.Base64.encodeBase64URLSafeString,從方法引用com.dqminh.app.util.Util.sendRequest

01-12 08:41:48.161:WARN/dalvikvm(457):VFY:無法解決靜態方法10146:Lorg/apache/commons/codec/binary/Base64; .encodeBase64URLSafeString([B] Ljava/lang/String;

8月1日至12日:41:48.161:WARN/dalvikvm(457):VFY:在0x0004

關於如何解決這個問題的任何線索拒絕操作碼0x71?非常感謝。

+3

你有任何的'apache.commons.codec'操作的類的?所以這是這個課程的一個特殊問題,還是你認爲沒有課程可用? – 2010-01-12 09:45:56

回答

49

我有一個類似的問題,而我正在開發使用Android與OAuth library

我也從android那裏得知,雖然我已經在類路徑中包含了apache.commons.codec,但沒找到一個特定的方法(encodeBase64String)。

檢查的javadoc,兩種方法都聲稱自己是1.4和更大的唯一,所以我的猜測是,機器人已經包括commons.codec當這些方法確實是不確定的舊版本。

我的解決辦法是使用舊的方法,像這樣:

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

您要使用的方法是不同的,因爲它取代+和/網址爲安全值 - 和_。所以你可能會使用類似的東西:

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

希望幫助!

+0

我已經爲此掙扎了兩天了!只是一個問題,如果我要取代+和 - 我將如何去解碼?如果原始編碼的字符串(替換之前)已經包含+和 - – jax 2010-06-08 12:27:04

+0

我猜這沒關係,你會像上面的例子一樣 – 2010-06-09 19:23:12

+0

你的代碼正在工作.... encodeBase64URLSafeString不工作謝謝 – 2015-01-10 06:15:57

10

我遇到了完全相同的問題。所以我開始瀏覽Android源代碼,事實證明,Pablo Fernandez關於Android的猜測有一個org.apache.commons.code.binary的實現是正確的。然而,它的1.2版本的Apache公共版本,不是1.4版本甚至1.5版本。 你可以在android source中看到自己。

作注,這是問題的this post

+0

「來源」的鏈接已損壞。你能解決這個問題嗎? – 2014-07-07 14:15:23

+1

@MichelAyres,完成。 – zarthross 2014-07-08 15:16:51

4
+2

鏈接已損壞。 – 2014-07-07 14:16:18

+2

謝謝@MichelAyres,我更新了鏈接。 – 2014-08-08 15:44:18

4

我對同一個pr的解決方案會將有問題的類org.apache.commons.codec.binary.Base64.java重命名爲org.apache.commons.codec.binary.ApacheBase64.java。我使用Eclipse重構完成了重命名。

這樣,最新的和最偉大的apache解決方案被保留和使用,並且當我的應用程序最終從android 1.6最低分母被解除時,沒有意外問題重現的機會。

注意我已將整個apache commons源代碼樹設置爲獨立的Eclipse java項目,位於我的Android項目旁邊。我的Android項目使用了許多Apache Commons類,但在Base64上因爲上述問題而失敗...

+0

我和Hash有完全相同的問題,並能夠以類似的方式解決它(我實際上重構了整個Codec庫的包名)。 – tstaylor7 2014-11-02 06:06:32

16

您不必使用apache commons,在android上您可以使用android.util.Base64代替。

+4

很有用,但需要API等級8(2.2.x)。 – 2012-09-26 23:14:31

+2

如果您使用依賴於Commons-Codec的庫,則不起作用。 – William 2014-01-24 07:00:06

+6

請注意,您需要使用'Base64.encode(「foobar」.getBytes(),Base64.Base64.NO_WRAP);'才能獲得與apache commons庫完全相同的結果。見:http://stackoverflow.com/questions/17912119 – 2014-03-21 06:14:21

2

請注意,這個答案是由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; 
    } 
+0

幫了我很多。特別是當使用aws簽名生成java類「SignedRequestsHelper」來簽署使用「org.apache.commons.codec.binary.Base64」的url時。但在android中我們必須使用「android.util.Base64」必須替換「Base64編碼器=新的Base64(); signature = new String(encoder.encode(rawHmac));」 「signature = new String(Base64.encode(rawHmac,Base64.NO_WRAP),」UTF-8「);」使其工作。詳細的評論是針對未來求助者的。願它幫助別人。謝謝..... – Ashiq 2017-09-15 10:24:42

8

您可以使用以下功能:

private static String encodeBase64URLSafeString(byte[] binaryData) { 

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

    } 

源+其他可能的標記列表:​​

0

你包括阿帕奇百科全書項目的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項目庫衝突,嘗試改變commons-codec的包名,然後將其生成爲jar或者導入源代碼,改變了包名;

0

知道這是一個老問題,但我對編譯API級別當最近面臨這個問題,並找到了問題的另一種解決方案:使用番石榴項目。

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

相關問題