在尝试使用最新的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();
}
Logcat输出:
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)
任何人都可以帮忙。
Google api doc表示当Google Play服务调用失败时,任务会返回异常。
任何人都可以帮忙。提前致谢
答案 0 :(得分:0)
您的设备很可能没有安装最新版本的Google Play服务。
一方面,您拥有API,如您所知,在版本11.0.0中,使用SafetyNetApi
转为使用SafetyNetClient
。
另一方面,您拥有Google Play服务,该服务可根据API的要求执行您所需的功能。但是,即使您使用最新版本的API构建应用程序,也无法保证运行应用程序的设备确实具有最新版本的Play服务。
逐字复制the documentation:
在使用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. }