似乎如果Android手机未登录Google Play,则checkAccess-call将抛出NullPointerException并最终导致应用程序崩溃:
// user not logged in to Google Play
LicenseChecker licenseChecker = new LicenseChecker(...);
licenseChecker.checkAccess(...) // throws a nullpointer exception and crasches the app
NullPointerException发生在Android框架内部的一个单独的线程中:
FATAL EXCEPTION: background thread
java.lang.NullPointerException
com.google.android.vending.licensing.LicenseValidator.verify()
因此,应用程序似乎无法捕获它并避免崩溃。
任何想法如何避免这次崩溃? (t应该是不能登录Google Play的合法情况)
我能想到的唯一方法是在调用checkAccess之前检查Google Play登录状态。
答案 0 :(得分:9)
我修改了License Validator.verify()方法,在开头添加了一个保护检查:
public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
if (signedData==null){
handleInvalidResponse();
return;
}
...
}
答案 1 :(得分:2)
我正在低调@Ben Lee的回答。
根据@jssingh上面提出的建议,我采用了以下解决方案:
public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
String userId = null;
// Skip signature check for unsuccessful requests
ResponseData data = null;
if (signedData != null && (responseCode == LICENSED || responseCode == NOT_LICENSED ||
responseCode == LICENSED_OLD_KEY)) {
// Verify signature.
try {
Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
sig.initVerify(publicKey);
sig.update(signedData.getBytes());
....
}
}
........
if (signedData == null) {
Crashlytics.logException(new Exception("Licensing signedData is null - responseCode=" + responseCode));
}
switch (responseCode) {
case LICENSED:
case LICENSED_OLD_KEY:
int limiterResponse = mDeviceLimiter.isDeviceAllowed(userId);
handleResponse(limiterResponse, data);
break;
.....
}
我利用Crashlytics日志验证声明,当signedData为null时,您不能只假设NOT_LICENSED。
事实上,这是我看到我的代码采用这个附加检查的条件:
case ERROR_CONTACTING_SERVER:
Log.w(TAG, "Error contacting licensing server.");
handleResponse(Policy.RETRY, data);
break;
似乎合法:)
答案 2 :(得分:0)
使用“扩展文件”时,我也遇到了同样的问题。可能是因为服务器在许可证检查时响应不好。因此它在LicenceChecker类中发送“ SignedData = null并且Signature = null ”。
最终会影响MainActivity的 onActivityResult(int requestCode,int resultCode,Intent data)。这里我们得到data = null。请尝试以下代码 - >
public onActivityResult(int requestCode, int resultCode, Intent data)
{
if (data != null) {
fromWhere = data.getExtras().getInt("yourInt");
done = data.getExtras().getInt("yourdata");
}
else {
//Your Default Value..
fromWhere = 1;
done = 0;
}
}
希望这会帮助一些人。祝你好运!!
答案 3 :(得分:0)
如果您只是想在Android模拟器上运行代码,您可以选择打开并登录Google Play商店,这将更新Google Play服务并解决问题