문제

오늘 저는 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 대신에.

나는 똑같은 문제를 경험했다. 그래서 나는 Android 소스 코드를 탐색하기 시작했고, org.apache.commons.code.binary를 구현하는 Android에 대한 Pablo Fernandez의 추측이 밝혀졌습니다. 그러나 버전 1.4 또는 1.5가 아닌 Apache Commons의 버전 1.2. 안드로이드에서 자신을 볼 수 있습니다 원천.

참고로 이것은 질문입니다. 이 게시물

다음 기능을 사용할 수 있습니다.

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top