Android와 함께 Apache Commons Codec : 방법을 찾을 수 없습니다.
-
20-09-2019 - |
문제
오늘 저는 Android 애플리케이션에 Apache.commons.codec 패키지를 포함 시키려고 시도했지만 실행할 수 없었습니다. Android는 Method Ord.apache.commons.codec.binary.*를 찾을 수 없습니다.* DDMS에서 다음 오류를 출력합니다.
01-12 08 : 41 : 48.161 : ERROR/DALVIKVM (457) : 메소드 org.apache.commons.codec.base.base.base64.encodebase64urlsafestring, method에서 참조 된 메소드를 찾을 수 없습니다. com.dqminh.app.util.sendrequest
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 : 0x0004에서 opcode 0x71 거부
이 문제를 해결하는 방법에 대한 단서가 있습니까? 정말 감사합니다.
해결책
Android를 사용하는 동안 비슷한 문제가있었습니다. OAUTH 라이브러리 나는 개발 중입니다.
나는 또한 Android에서 얻었지만 포함했지만 apache.commons.codec
클래스 경로에서 특정 방법 (encodeBase64String
) 찾을 수 없습니다.
Javadocs를 점검하면 두 방법이 모두 주장됩니다 1.4 이상, 안드로이드에는 이미 이전 버전이 포함되어 있다고 생각합니다. commons.codec
이러한 방법이 실제로 정의되지 않은 곳.
내 해결책은 다음과 같은 오래된 방법을 사용하는 것이 었습니다.
String encodedString = new String(Base64.encodeBase64('string to encode'));
사용하려는 메소드는 + 및 / / URL -SAFE 값을 대체하므로 _ 및 _입니다. 따라서 아마도 다음과 같은 것을 사용할 수 있습니다.
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
같은 문제에 대한 나의 해결책은 문제가있는 클래스의 이름을 바꾸는 것입니다. org.apache.commons.codec.binary.Base64.java
~ 안으로 org.apache.commons.codec.binary.ApacheBase64.java
. Eclipse Refactor-Rename을 사용하여했습니다.
이렇게하면 최신 및 가장 큰 Apache 솔루션이 보존되고 사용되며, Android 1.6 가장 낮은 분모에서 앱이 들어 올릴 때 우발적 인 문제 재발의 가능성이 없습니다.
참고 전체 Apache Commons 소스 트리가 이미 Android 프로젝트 옆에 별도의 Eclipse Java 프로젝트로 설정되었습니다. 내 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.java2.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 라이브러리와 동일한 결과를 얻으려면 참조 : stackoverflow.com/questions/17912119
이 답변은 Android 앱을 Java "Desktop"앱과 통신하기 위해 몇 시간 동안 작동 한 유일한 것입니다.
여기에는 몇 가지 소스 코드가 있습니다. 아마도 다른 사람들에게 도움이 될 것입니다.
코드 데스크탑 애플릿:
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 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 Project Libs와 충돌하고 Commons-Codec의 패키지 이름을 변경하려고 시도한 다음 항아리로 생성하거나 소스 코드가 패키지 이름을 변경 한 것입니다.
이것이 오래된 질문이라는 것을 알고 있지만 최근 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;
}