0

尝试在最新的 Play-Services v11.0.1 中使用 SafetyNetClient.attest(...) 进行证明时,客户端出错并返回 ApiException。

代码片段:

byte[] nonce = getRequestNonce();
String apiKey = "<api key>";
mSafetyNetClient.attest(nonce, apiKey)
        .addOnCompleteListener(new OnCompleteListener<SafetyNetApi.AttestationResponse>() {
            @Override
            public void onComplete(@NonNull Task<SafetyNetApi.AttestationResponse> task) {
            ...
            }
        });
...
private byte[] getRequestNonce() {
    String nonceData = "Safety Net Sample: " + System.currentTimeMillis();
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    byte[] bytes = new byte[24];
    mRandom.nextBytes(bytes);
    try {
        byteStream.write(bytes);
        byteStream.write(nonceData.getBytes());
    } catch (IOException e) {
        return null;
    }

    return byteStream.toByteArray();
}

日志输出:

06-20 16:43:57.987 18222-18222/com.example.test W/System.err: com.google.android.gms.common.api.ApiException
06-20 16:43:57.987 18222-18222/com.example.test W/System.err:     at com.google.android.gms.common.internal.zzb.zzx(Unknown Source)
06-20 16:43:57.987 18222-18222/com.example.test W/System.err:     at com.google.android.gms.common.internal.zzbi.zzy(Unknown Source)
06-20 16:43:57.987 18222-18222/com.example.test W/System.err:     at com.google.android.gms.common.internal.zzbj.zzo(Unknown Source)
06-20 16:43:57.987 18222-18222/com.example.test W/System.err:     at com.google.android.gms.internal.zzbbd.zzb(Unknown Source)
06-20 16:43:57.987 18222-18222/com.example.test W/System.err:     at com.google.android.gms.internal.zzbbd.setResult(Unknown Source)
06-20 16:43:57.988 18222-18222/com.example.test W/System.err:     at com.google.android.gms.internal.zzcsh.zza(Unknown Source)
06-20 16:43:57.988 18222-18222/com.example.test W/System.err:     at com.google.android.gms.internal.zzcrw.onTransact(Unknown Source)
06-20 16:43:57.988 18222-18222/com.example.test W/System.err:     at android.os.Binder.execTransact(Binder.java:565)

任何人都可以请帮忙。

谷歌 api 文档说当调用谷歌播放服务失败时任务返回异常。

任何人都可以帮忙。提前致谢

4

1 回答 1

0

您的设备很可能没有安装最新版本的 Google Play 服务。

一方面,您拥有 API,如您所知,它在 11.0.0 版本中从 using 移动SafetyNetApi到 using SafetyNetClient

另一方面,您拥有 Google Play 服务,它会按照 API 的要求执行您需要的功能。但是,即使您使用最新版本的 API 构建应用程序,也不能保证运行您的应用程序的设备确实具有最新版本的 Play 服务。

从文档中逐字复制:

在使用 SafetyNet Attestation API 之前,您必须确保在用户的设备上安装了正确版本的 Google Play 服务。如果安装了错误的版本,您的应用可能会在调用 API 后停止响应。如果您的应用检测到安装了不正确的版本,您应该要求用户更新其设备上的 Google Play 服务应用。

要检查已安装的 Google Play 服务版本是否与您使用的 Android SDK 版本兼容,请调用 isGooglePlayServicesAvailable() 方法,如以下代码片段所示:

if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
        == ConnectionResult.SUCCESS) {
  // The SafetyNet Attestation API is available.
}
于 2018-03-07T04:32:58.417 回答