Exception java.lang.NoSuchMethodError: decodeBase64 in Android devices with API < 28

Ouverte
#603 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
android, java
Domaine
mobile-dev

Piste de recherche

Commencez par com.google.api.client.util.Base64.java et PemReader, là où la trace de la pile atteint l’appel incompatible à decodeBase64, puis examinez comment la dépendance Apache Commons Codec est résolue pour Android. Reproduisez le problème avec l’exemple de reconnaissance vocale Android sur une API inférieure à 28 et vérifiez que le chargement des identifiants ne lève plus de NoSuchMethodError.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

type: feature request

Hi,
We have found that the library is throwing an exception in any Android device with and API < 28 (Android 9.0) after version com.google.cloud:google-cloud-speech:0.70.0-beta. The problem is related with this issue. As far as we know, Apache common codec library dependency version is 1.10 in this project, but Android in versions below 9.0 has the same classes in boot classpath, so classes from the version 1.10 will never be loaded. This issue will not be solved in Android, thus we would like to ask for a solution here, removing/replacing the dependency in some way.
Thanks in advance.

Please include as much information as possible:

Environment details
  • OS: Android API < 28
  • Java version:1.8
  • google-cloud-java version(s): from 0.71.0-beta
Steps to reproduce

1. Zip file attached or get Android speech example source code from:
https://github.com/GoogleCloudPlatform/android-docs-samples/tree/master/speech/SpeechRecognitionClient

2. Import app into Android Studio.

3. Modify build-gradle (module app) file to update dependencies in
section dependencies:

 // add these dependencies for the speech client
    implementation 'io.grpc:grpc-okhttp:1.18.0'
    implementation 'com.google.cloud:google-cloud-speech:0.71.0-beta'

4. Build app with Android Studio and run in development mode on Android device below API 28.

Stacktrace
2019-02-21 10:56:28.171 12310-12310/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.google.cloud.examples.speechrecognition, PID: 12310
    java.lang.NoSuchMethodError: No static method decodeBase64(Ljava/lang/String;)[B in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
        at com.google.api.client.util.Base64.decodeBase64(Base64.java:101)
        at com.google.api.client.util.PemReader.readNextSection(PemReader.java:106)
        at com.google.api.client.util.PemReader.readFirstSectionAndClose(PemReader.java:135)
        at com.google.auth.oauth2.ServiceAccountCredentials.privateKeyFromPkcs8(ServiceAccountCredentials.java:290)
        at com.google.auth.oauth2.ServiceAccountCredentials.fromPkcs8(ServiceAccountCredentials.java:280)
        at com.google.auth.oauth2.ServiceAccountCredentials.fromJson(ServiceAccountCredentials.java:210)
        at com.google.auth.oauth2.GoogleCredentials.fromStream(GoogleCredentials.java:174)
        at com.google.auth.oauth2.GoogleCredentials.fromStream(GoogleCredentials.java:141)
        at com.google.cloud.examples.speechrecognition.MainActivity$mSpeechClient$2$1$1.getCredentials(MainActivity.kt:69)
        at com.google.cloud.examples.speechrecognition.MainActivity$mSpeechClient$2$1$1.getCredentials(MainActivity.kt:47)
        at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:132)
        at com.google.cloud.speech.v1.stub.GrpcSpeechStub.create(GrpcSpeechStub.java:94)
        at com.google.cloud.speech.v1.stub.SpeechStubSettings.createStub(SpeechStubSettings.java:126)
        at com.google.cloud.speech.v1.SpeechClient.<init>(SpeechClient.java:144)
        at com.google.cloud.speech.v1.SpeechClient.create(SpeechClient.java:126)
        at com.google.cloud.examples.speechrecognition.MainActivity$mSpeechClient$2.invoke(MainActivity.kt:68)
        at com.google.cloud.examples.speechrecognition.MainActivity$mSpeechClient$2.invoke(MainActivity.kt:47)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at com.google.cloud.examples.speechrecognition.MainActivity.getMSpeechClient(MainActivity.kt)
        at com.google.cloud.examples.speechrecognition.MainActivity.onResume(MainActivity.kt:105)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
        at android.app.Activity.performResume(Activity.java:6830)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3407)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3470)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6121)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

Code snippet
 private val mSpeechClient by lazy {
        // NOTE: The line below uses an embedded credential (res/raw/sa.json).
        //       You should not package a credential with real application.
        //       Instead, you should get a credential securely from a server.
        applicationContext.resources.openRawResource(R.raw.google_cloud_credentials).use {
            SpeechClient.create(SpeechSettings.newBuilder()
                    .setCredentialsProvider { GoogleCredentials.fromStream(it) }
                    .build())
        }
    }
Any additional information below

Thanks!

Langage dominant
Java
Étoiles
1.4k
Forks
476
Merge moyen
10 h 47 min
PR mergées (30 j)
3

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de googleapis/google-http-java-client

Toutes les issues de googleapis/google-http-java-client

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.