Android LicenseChecker与空指针exception崩溃

看来,如果Android手机没有login到Google Play,checkAccess调用将抛出一个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应该是不会被login到Google Play的合法情况)

我能想到的唯一方法是在调用checkAccess之前检查Google Playlogin状态。

Solutions Collecting From Web of "Android LicenseChecker与空指针exception崩溃"

我修改了LicenseValidator.verify()方法,在开始时添加一个保护检查:

 public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) { if (signedData==null){ handleInvalidResponse(); return; } ... } 

在使用“扩展文件”时,我也遇到同样的问题。 这可能是因为服务器在许可证检查时没有反应良好。 所以它在LicenceChecker类中发送“ SignedData = null和Signature = null ”。

最终影响MainActivity的onActivityResult(int requestCode,int resultCode,Intent数据) 。 这里我们得到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; } } 

希望这将有助于一个人。 好运!!

如果您只是试图在Android模拟器上运行代码,则可以select打开并loginGoogle Play商店,该商店将更新Google Play服务并解决问题

我正在下调@本·李的回答。

基于@jssingh提出的build议,我采取了以下解决scheme:

 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日志logging来validation声明,当signedData为null时,您不能仅仅假定NOT_LICENSED。

事实上,这是我看到我的代码与这个额外的检查到位的条件:

  case ERROR_CONTACTING_SERVER: Log.w(TAG, "Error contacting licensing server."); handleResponse(Policy.RETRY, data); break; 

似乎是合法的 :)