4

アプリでの音声認識に 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: }

毎回このエラーが発生するわけではありませんが、特定の場合にのみ発生します。私は2つの活動をしています。AとBに名前を付けましょう。

アクティビティ A には、アクティビティ B を開始するボタンがあります。アクティビティ B は Google Cloud Speech API と通信し、結果を TextView に表示します。

次の手順の後にこのエラーが発生します(Samsung GT-P5110 (Android 4.2.2)):

  1. アクティビティ A を開始 -> ボタンを押してアクティビティ B を開始します。

// 最初はすべて問題ありません。サーバーから結果を受け取り、これを表示します。

  1. アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。

  2. ボタンを押して、アクティビティ B を開始します。

// この時点で、上に示したエラーが発生します。

Lenovo A1000 (API 5.0.1) および Xiaomi Mi4c (5.0.1) で次のエラーが発生します。

  1. アクティビティ A を開始 -> ボタンを押してアクティビティ B を開始します。

  2. アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。

  3. ボタンを押して、アクティビティ B を開始します。

// すべてが大丈夫です

  1. アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。

  2. アプリを最小化します。

  3. 5 ~ 6 分以上経過したら、アクティビティ A に戻ります。

  4. アクティビティ B を開始します。

// 現時点では、常にこのエラーが発生します。

アプリケーションを再起動するとすべて問題ありませんが、アクティビティ B を再度開くとエラーが表示されます。

この問題を解決する方法を誰が知っていますか?

Play Services Dynamic Security Provider を使用しています ( gRPC に必要です)。最新バージョンの Google Play Services (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 (モジュール: アプリ)

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 (プロジェクト)

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
}

お時間をいただきありがとうございます:)

4

1 に答える 1

1

この問題はフォーラムで報告しました。

この問題は、サービス アカウントの資格情報をアプリケーションに埋め込んでいるために発生します。一定期間後、作成されたトークンが内部的に更新されると、次のエラーがスローされます。

com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken リンク

本番環境では、サーバーからアクセス トークンを提供するため、次のようにインスタンス化できますGoogleCredentials

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

これにより、エラーがスローされるのを防ぐことができます。

于 2016-09-29T19:53:53.487 に答える