Código de retorno de API de Cloud = UNAUTHENTICATED, cause = java.io.IOException: Error al obtener el token de acceso para la cuenta de servicio:
Utilizo Google Cloud Speech API (StreamingRecognize a través de gRPC) para el reconocimiento de voz en mi aplicación. Tengo el problema con la autenticación en dispositivos Android nivel <23.
V/NativeCrypto: SSL handshake aborted: ssl=0x5b0ed2d0: Failure in SSL library, usually a protocol error error:10000095:SSL routines:OPENSSL_internal:ERROR_PARSING_EXTENSION (third_party/openssl/boringssl/src/ssl/t1_lib.c:2336 0x5b0fcd50:0x00000001) error:100000be:SSL routines:OPENSSL_internal:PARSE_TLSEXT (third_party/openssl/boringssl/src/ssl/handshake_client.c:893 0x5aca7d31:0x00000000) V/NativeCrypto: SSL shutdown failed: ssl=0x5b0ed2d0: Failure in SSL library, usually a protocol error error:100000fa:SSL routines:OPENSSL_internal:SHUTDOWN_WHILE_IN_INIT (third_party/openssl/boringssl/src/ssl/ssl_lib.c:703 0x5aca7d31:0x00000000) V/NativeCrypto: SSL handshake aborted: ssl=0x58523fb8: Failure in SSL library, usually a protocol error error:1000042e:SSL routines:OPENSSL_internal:TLSV1_ALERT_PROTOCOL_VERSION (third_party/openssl/boringssl/src/ssl/tls_record.c:469 0x5b258bd8:0x00000001) V/NativeCrypto: SSL shutdown failed: ssl=0x58523fb8: Failure in SSL library, usually a protocol error error:100000fa:SSL routines:OPENSSL_internal:SHUTDOWN_WHILE_IN_INIT (third_party/openssl/boringssl/src/ssl/ssl_lib.c:703 0x5aca7d31:0x00000000) Status{code=UNAUTHENTICATED, description=null, cause=java.io.IOException: Error getting access token for service account: }
No consigo este error cada vez, pero solamente en caso específico. Tengo dos actividades. Nombren A y B.
- ¿Cómo puedo añadir un solo divisor después de algunos elementos para separar un grupo en RecyclerView?
- ¿Existe un límite en el número de líneas de código que puede poner en un doublaje de Eclipse java
- Reembolso de las compras de prueba al probar Google in-App
- ¿Cómo saber si una coordenada X e Y están dentro de mi botón?
- ¿Cómo obtener las unidades preferidas por el usuario? (Métrico (metros) o imperial (millas))?
La actividad A tiene un botón que inicia la actividad B. La actividad B se comunica con Google Cloud Speech API y muestra los resultados en TextView.
Consigo este error después de los pasos siguientes (en Samsung GT-P5110 (androide 4.2.2)):
- Inicie la Actividad A -> pulse el Botón para iniciar la Actividad B.
// En la primera vez todo está bien. Recibo el resultado del servidor y muestro esto.
-
Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).
-
Presione el botón para iniciar la Actividad B.
// En este momento recibo un error, que fue mostrado arriba.
Consigo este error en Lenovo A1000 (API 5.0.1) y Xiaomi Mi4c (5.0.1) después de:
-
Inicie la Actividad A -> pulse el Botón para iniciar la Actividad B.
-
Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).
-
Presione el botón para iniciar la Actividad B.
// Todo está bien
-
Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).
-
Minimizar la aplicación.
-
Después de 5-6 o más minutos volver a la actividad A.
-
Comenzar Actividad B.
// En este momento siempre obtengo este error.
Después de reiniciar la aplicación todo está bien, pero aparece error después de reabrir la actividad B.
¿Quién sabe cómo puedo solucionar este problema?
Yo uso Play Services Dynamic Security Provider ( Es necesario para gRPC ). Instalé la última versión de Google Play Services (9.6.83). No resuelve el problema.
Creo ManagedChannel siguiendo el código:
GoogleCredentials creds = GoogleCredentials.fromStream(credentials); creds = creds.createScoped(OAUTH2_SCOPES); OkHttpChannelProvider provider = new OkHttpChannelProvider(); OkHttpChannelBuilder builder = provider.builderForAddress(host, port); ManagedChannel channel = builder.intercept(new ClientAuthInterceptor(creds, Executors .newSingleThreadExecutor ())) .build(); private static final List<String> OAUTH2_SCOPES = Arrays.asList("https://www.googleapis.com/auth/cloud-platform");
Crear SpeechGrpc.SpeechStub:
SpeechGrpc.SpeechStub mSpeechClient = SpeechGrpc.newStub(channel);
Build.gradle (Módulo: app)
apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" } grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.0.1' } } generateProtoTasks { all().each { task -> task.plugins { javalite {} grpc { // Options added to --grpc_out option 'lite' } } } } } android { compileSdkVersion 24 buildToolsVersion "24.0.2" dexOptions { javaMaxHeapSize "2048M" } defaultConfig { applicationId "someAppID" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0.10" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } def grpcVersion = '1.0.1' dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:appcompat-v7:24.2.1' compile 'javax.annotation:javax.annotation-api:1.2' compile 'com.google.android.gms:play-services:9.6.0' compile "io.grpc:grpc-okhttp:${grpcVersion}" compile "io.grpc:grpc-protobuf:${grpcVersion}" compile "io.grpc:grpc-stub:${grpcVersion}" compile "io.grpc:grpc-auth:${grpcVersion}" compile ('com.google.auth:google-auth-library-oauth2-http:0.3.0'){ exclude module: 'httpclient' } compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.itextpdf:itextg:5.5.9' compile 'com.android.support:recyclerview-v7:24.2.1' }
build.gradle (Proyecto)
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { // mavenLocal() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
Gracias por tu tiempo 🙂
- Cómo saber si Proguard ha hecho su trabajo
- SurfaceView for Camera Preview no se destruye cuando se pulsa el botón de encendido
- default: setPolicyDataEnable (enabled = true) ¿qué es?
- Programar tareas asíncronas múltiples en android
- ¿Por qué google map v2 de repente se estrelló por java.lang.NullPointerException: Intento de obtener la longitud de matriz nula?
- ListFragment aparece dos veces en el teléfono
- Biblioteca Java usando selectores css para analizar XML
- Daga: Inyectar campo en el pojo proporcionado
Informé de este problema en el foro .
El problema se produce porque está incrustando sus credenciales de cuenta de servicio en la aplicación. Después de un período de tiempo, cuando el token que se crea se actualiza internamente, se genera el error de:
vínculo com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken
En la producción, suministrará el token de acceso desde su servidor y, por lo tanto, podrá instanciar GoogleCredentials
la GoogleCredentials
manera:
final GoogleCredentials googleCredentials = new GoogleCredentials(accessToken) { @Override public AccessToken refreshAccessToken() throws IOException { return accessToken; } }.createScoped(OAUTH2_SCOPES);
Esto evitará que se genere el error.