Exception java.lang.NoSuchMethodError: decodeBase64 in Android devices with API < 28
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
- 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
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
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de googleapis/google-http-java-client
-
Core: Validate header names and values to prevent CRLF injectionPeut-être pris @insaf021 l’a pris il y a 106 jours. Ouvertepriority: p3
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
Core: XmlPullParser processes external DTD entities (XXE) — disable FEATURE_PROCESS_DOCDECL in Xml#createParser()Peut-être pris @insaf021 l’a pris il y a 106 jours. Ouvertepriority: p3
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
-
Core: LowLevelHttpResponse not disconnected when HttpResponse construction throws RuntimeExceptionPeut-être pris @insaf021 l’a pris il y a 106 jours. Ouvertepriority: p3
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
-
type: cleanup
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
org.apache.http.conn.ssl.SSLSocketFactory is deprecatedPeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertepriority: p2 type: cleanup
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Toutes les issues de googleapis/google-http-java-client
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
finos/fluxnova-bpm-platform#387 ·
Les mainteneurs répondent en général sous 4 jours
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
-
Difficulté 2/5 Moins d'une heure Accessibilité débutants 84/100
cpp-best-practices/project_validator#251 ·
Les mainteneurs répondent en général sous 1 jour
-
backend enhancement
Difficulté 2/5 Une demi-journée Accessibilité débutants 70/100
damodharg6/payledger#16 ·
-
[Bug]: An initiative list with no current entry logs an error on every changePeut-être pris @dwizard0 l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour