Android LicenseChecker因空指针异常而崩溃

青春须早为,岂能长少年。这篇文章主要讲述Android LicenseChecker因空指针异常而崩溃相关的知识,希望能为你提供帮助。
似乎如果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登录状态。
答案我修改了License Validator.verify()方法,在开头添加了一个保护检查:
public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) { if (signedData=https://www.songbingjia.com/android/=null){ handleInvalidResponse(); return; } ... }

另一答案我正在低调@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 = https://www.songbingjia.com/android/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;

似乎是合法的 :)
另一答案使用“扩展文件”时,我也遇到了同样的问题。可能是因为服务器在许可证检查时响应不好。因此它在LicenceChecker类中发送“SignedData = https://www.songbingjia.com/android/null并且Signature = null”。
这最终会影响MainActivity的onActivityResult(int requestCode,int resultCode,Intent data)。这里我们得到data = https://www.songbingjia.com/android/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; } }

希望这会帮助一些人。好运!!
另一答案【Android LicenseChecker因空指针异常而崩溃】如果您只是想在Android模拟器上运行代码,您可以打开并登录Google Play商店,这将更新Google Play服务并解决问题

    推荐阅读