Cloud Speech API返回码= UNAUTHENTICATED,cause = java.io.IOException:获取服务帐户的访问令牌时出错:

时间:2016-09-28 20:33:41

标签: java android google-cloud-speech boringssl grpc-java

我在我的应用中使用Google Cloud Speech API(通过gRPC进行StreamingRecognize)进行语音识别。我在Android设备API级别上验证了问题< 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: }

我不是每次都会收到此错误,但仅限于特定情况。我有两项活动。让我们命名为A和B.

活动A有一个按钮,它启动活动B. 活动B与Google Cloud Speech API通信并在TextView中显示结果。

按照以下步骤(在Samsung GT-P5110(Android 4.2.2)上)后出现此错误:

  1. 开始活动A - >按Button启动活动B.
  2. //第一次一切都好。我从服务器收到结果并显示此信息。

    1. 关闭活动B(按后退按钮或调用onBackPressed或完成)。

    2. 按按钮启动活动B.

    3. //在这一刻我得到错误,如上所示。

      我在联想A1000(API 5.0.1)和小米Mi4c(5.0.1)之后遇到此错误:

      1. 开始活动A - >按下按钮以启动活动B.

      2. 关闭活动B(按后退按钮或调用onBackPressed或完成)。

      3. 按按钮启动活动B.

      4. //一切都很好

        1. 关闭活动B(按后退按钮或调用onBackPressed或完成)。

        2. 最小化应用

        3. 5-6分钟后,返回活动A.

        4. 开始活动B.

        5. //在这一刻我总是得到这个错误。

          重新启动应用程序后,一切正常,但重新打开活动B后会出现错误。

          谁知道我怎么能解决这个问题?

          我使用Play服务动态安全提供程序(It is required for gRPC)。 我安装了最新版Google Play服务(9.6.83)。它没有解决问题。

          我通过以下代码创建ManagedChannel:

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

          创建SpeechGrpc.SpeechStub:

          SpeechGrpc.SpeechStub mSpeechClient = SpeechGrpc.newStub(channel);
          

          build.gradle(Module: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(Project)

          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
          }
          
          谢谢你的时间:)

1 个答案:

答案 0 :(得分:1)

我报告了此问题in the forum

出现此问题的原因是您将服务帐户凭据嵌入应用程序中。一段时间后,当内部刷新创建的令牌时,将抛出错误:

com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken link

在生产中,您将从服务器提供访问令牌,因此能够实例化GoogleCredentials,如下所示:

    final GoogleCredentials googleCredentials = new GoogleCredentials(accessToken) {
        @Override
        public AccessToken refreshAccessToken() throws IOException {
            return accessToken;
        }
    }.createScoped(OAUTH2_SCOPES);

这样可以防止错误被抛出。