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.

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)):

  1. 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.

  1. Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).

  2. 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:

  1. Inicie la Actividad A -> pulse el Botón para iniciar la Actividad B.

  2. Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).

  3. Presione el botón para iniciar la Actividad B.

// Todo está bien

  1. Cierre la Actividad B (presione el Botón Atrás o llame a Encabezado o Acabado).

  2. Minimizar la aplicación.

  3. Después de 5-6 o más minutos volver a la actividad A.

  4. 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 🙂

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.

  • Agregar dinámicamente a horizontalscrollview
  • Dibuja una ruta siguiendo tu ubicación en Google Maps para Android
  • Problema de conexión Android Bluetooth LE
  • Método startManagingCursor (cursor) obsoleto
  • ¿Cómo puedo obtener el nombre del paquete del lanzador actual en android 2.3 y superior?
  • Extendiendo AsyncTask <Void, Void, Void>
  • ¿Por qué algunas clases no son públicas en la Biblioteca de soporte de Android?
  • Notificación no mostrada cuando setGroup () se llama en Android KitKat
  • Google google maps agrega al marcador propia etiqueta
  • El contexto de la aplicación devuelve null cuando se utiliza getFilesDir ()
  • Desempeño de Android: "Evita los internos y los setters"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.