Pergunta

Hoje tentei incluir o pacote Apache.commons.codec no meu aplicativo Android e não consegui executá -lo. O Android não conseguiu encontrar o método ord.apache.commons.codec.binary.* E emitir os seguintes erros no DDMS

01-12 08: 41: 48.161: Erro/dalvikvm (457): não foi possível encontrar o método org.apache.commons.codec.binary.base64.encodeBase64urlSafestring, referenciado do método com.dqmh.App.util.util.SENDREQUESTE,

01-12 08: 41: 48.161: warn/dalvikvm (457): vfy: incapaz de resolver o método estático 10146: lorg/apache/commons/codec/binário/base64; .encodeBase64urlSafestring ([b) ljava/lang/string;

01-12 08: 41: 48.161: warn/dalvikvm (457): vfy: rejeitando o OPCode 0x71 em 0x0004

Alguma pista sobre como resolver esse problema? Muito obrigado.

Foi útil?

Solução

Eu tive um problema semelhante ao usar Android com um Biblioteca Oauth Estou desenvolvendo.

Eu também recebi do Android, embora tenha incluído apache.commons.codec no caminho de classe, um método específico (encodeBase64String) não foi encontrado.

Verificando os javadocs, ambos os métodos afirmam ser 1.4 e maior apenas, então meu palpite é que o Android já inclui uma versão mais antiga de commons.codec onde esses métodos são realmente indefinidos.

Minha solução era usar um método mais antigo, como este:

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

O método que você deseja usar é diferente, pois substitui + e / por valores seguros de URL - e _. Então você provavelmente pode usar algo como:

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

Espero que ajude!

Outras dicas

Você não precisa usar o Apache Commons, no Android que você pode usar Android.util.base64 em vez de.

Eu experimentei exatamente o mesmo problema. Então, comecei a navegar no código -fonte do Android e, como se vê, o palpite de Pablo Fernandez sobre o Android ter uma implementação de org.apache.commons.code.binary está correto. No entanto, sua versão 1.2 do Apache Commons, não a versão 1.4 ou mesmo 1.5. Você pode ver por si mesmo no android fonte.

Como uma nota, essa é uma questão é uma duplicata de esta postagem

Você pode usar a seguinte função:

private static String encodeBase64URLSafeString(byte[] binaryData) {

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

    }

Fonte + Listagem de outros sinalizadores possíveis: http://developer.android.com/reference/android/util/base64.html

Minha solução para o mesmo problema era renomear a classe problemática org.apache.commons.codec.binary.Base64.java em org.apache.commons.codec.binary.ApacheBase64.java. Eu fiz isso usando o Eclipse Refactor-Rename.

Dessa forma, a mais recente e mais recente solução Apache é preservada e usada, e não há chance de recorrência acidental de problemas quando meu aplicativo acaba sendo levantado do Android 1.6 Menor denominador.

Observe que eu já tinha toda a árvore de origem do Apache Commons já definida como um projeto Java Eclipse separado, ao lado do meu projeto Android. Meu projeto Android usou muitas das aulas do Apache Commons, mas falhou no Base64 por causa dos problemas descritos acima ...

Observe que esta resposta foi feita por Dylan Watson Nos comentários acima:

Esteja ciente de que você precisa usar base64.encode ("foobar" .getBytes (), base64.base64.no_wrap); Para obter exatamente o mesmo resultado da Biblioteca Apache Commons. Veja: Stackoverflow.com/questions/17912119

Essa resposta foi a única que funcionou após horas tentando comunicar meu aplicativo Android com um aplicativo Java "Desktop".

Então, aqui está algum código -fonte, talvez ajude outros:

Código do Appleto de mesa:

   private static String convertToBase64(String s) {
        byte[] bytes = new byte[0];
        try {
            bytes = (s.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return DatatypeConverter.printBase64Binary(bytes);
    }

Este trecho é usado no App 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;
    }

Você incluiu o projeto Apache Commons Lib, como

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

O Gav do Commons-Codec é

commons-codec:commons-codec 

Mas o nome do pacote é

org.apache.commons.codec

Este nome do pacote estará em conflito com o Apache Commons Project Libs, tente alterar o nome do pacote do Commons-Codec e, em seguida, gerá-lo como um frasco ou importar o código-fonte alterado o nome do pacote;

Sabendo que essa é uma pergunta antiga, mas enfrentei esse problema recentemente ao compilar o nível da API 23, e encontrei outra solução para o problema: use goiaba projeto.

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

A biblioteca de goiaba (18.0) foi a versão que eu usei e a mudança foi suave. O código funciona conforme o esperado.

Solução encontrada aqui: https://memorynotfound.com/encode-decode-base64-string-using-native-java/

Isso funciona para mim:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top