我收到了一个错误,我发疯了,因为只是在某些情况下才发生,但我真的不明白什么时候,也许更专业的眼睛可以帮助我:
在Google教程中,我采用了代码进行应用内购买,简要说明这段代码:
Initialize the In-App Service
Retrieve the price
对象
Start the in-purchase
如果用户单击"购买"按钮.
现在,在我做这项工作很好(更多的器件和API)的所有测试,但我得到吨的报告,说:抛出NullPointerException
上mHelper
.
我认为这发生在服务处理时OnDestroy()上,但我不确定,我无法解决它(最终完成错误日志).
这是我清理和评论尽可能多的代码:
IabHelper mHelper; IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener; Activity c; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_room); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); c=this; //Initialize the In-App Service mHelper = new IabHelper(this, "my_key"); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { //Problem setting up In-app Billing return; } if (mHelper == null) return; //Ask for the price List additionalSkuList = new ArrayList(); additionalSkuList.add("SKU_ID"); try { mHelper.queryInventoryAsync(true, additionalSkuList, mQueryFinishedListener); }catch (Exception e){ //Fail while asking the price } } }); //Buy Button Listener b_buy.setOnClickListener(new View.OnClickListener() { public void onClick(View V) { try { String payload= "my_payload" mHelper.launchPurchaseFlow(c, "SKU_ID",1111,mPurchaseFinishedListener, payload); } catch (Exception e) { //Error launching purchase flow. Another async operation in progress } } }); // Callback for when a purchase is finished mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isFailure()) { //Error while buying return; } if (purchase.getSku().equals("SKU_ID")) { // bought the premium upgrade! } } }; } //For retrieve the price: IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { return; } String z = inventory.getSkuDetails("SKU_ID").getPrice(); //The price of the object is + z !!! } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (mHelper == null) return; // Pass on the activity result to the helper for handling if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } } @Override public void onDestroy() { super.onDestroy(); if (mHelper != null) mHelper.dispose(); mHelper = null; } @Override public void onBackPressed() { super.onBackPressed(); finish(); } }
这是错误:
Exception java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference com.myproj.util.IabHelper.startSetup (IabHelper.java) __null__.dispose (IabHelper.java) __null__.launchPurchaseFlow (IabHelper.java) __null__.handleActivityResult (IabHelper.java) __null__.queryInventory (IabHelper.java) __null__.queryInventoryAsync (IabHelper.java) __null__.getResponseDesc (IabHelper.java) __null__.checkSetupDone (IabHelper.java) __null__.getResponseCodeFromBundle (IabHelper.java) __null__.getResponseCodeFromIntent (IabHelper.java) __null__.queryPurchases (IabHelper.java) __null__.querySkuDetails (IabHelper.java) com.myproj.util.IabHelper.startSetup (IabHelper.java) __null__.dispose (IabHelper.java) __null__.launchPurchaseFlow (IabHelper.java) __null__.handleActivityResult (IabHelper.java) __null__.queryInventory (IabHelper.java) __null__.queryInventoryAsync (IabHelper.java) __null__.getResponseDesc (IabHelper.java) __null__.checkSetupDone (IabHelper.java) __null__.getResponseCodeFromBundle (IabHelper.java) __null__.getResponseCodeFromIntent (IabHelper.java) __null__.queryPurchases (IabHelper.java) __null__.querySkuDetails (IabHelper.java) com.myproj.util.IabHelper.startSetup (IabHelper.java) __null__.dispose (IabHelper.java) __null__.launchPurchaseFlow (IabHelper.java) __null__.handleActivityResult (IabHelper.java) __null__.queryInventory (IabHelper.java) __null__.queryInventoryAsync (IabHelper.java) __null__.getResponseDesc (IabHelper.java) __null__.checkSetupDone (IabHelper.java) __null__.getResponseCodeFromBundle (IabHelper.java) __null__.getResponseCodeFromIntent (IabHelper.java) __null__.queryPurchases (IabHelper.java) __null__.querySkuDetails (IabHelper.java) com.myproj.util.IabHelper$2.run (IabHelper.java) java.lang.Thread.run (Thread.java:818)
以下是Google IabHelper类的一些参与方法(可能您不需要阅读此内容)它们只是在错误日志中提到并由Google编写:
配置:
public void dispose() { logDebug("Disposing."); mSetupDone = false; if (mServiceConn != null) { logDebug("Unbinding from service."); if (mContext != null) mContext.unbindService(mServiceConn); } mDisposed = true; mContext = null; mServiceConn = null; mService = null; mPurchaseListener = null; }
StartSetup:
public void startSetup(final OnIabSetupFinishedListener listener) { // If already set up, can't do it again. checkNotDisposed(); if (mSetupDone) throw new IllegalStateException("IAB helper is already set up."); // Connection to IAB service logDebug("Starting in-app billing setup."); mServiceConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { logDebug("Billing service disconnected."); mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { if (mDisposed) return; logDebug("Billing service connected."); mService = IInAppBillingService.Stub.asInterface(service); String packageName = mContext.getPackageName(); try { logDebug("Checking for in-app billing 3 support."); // check for in-app billing v3 support int response = mService.isBillingSupported(3, packageName, ITEM_TYPE_INAPP); if (response != BILLING_RESPONSE_RESULT_OK) { if (listener != null) listener.onIabSetupFinished(new IabResult(response, "Error checking for billing v3 support.")); // if in-app purchases aren't supported, neither are subscriptions. mSubscriptionsSupported = false; return; } logDebug("In-app billing version 3 supported for " + packageName); // check for v3 subscriptions support response = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS); if (response == BILLING_RESPONSE_RESULT_OK) { logDebug("Subscriptions AVAILABLE."); mSubscriptionsSupported = true; } else { logDebug("Subscriptions NOT AVAILABLE. Response: " + response); } mSetupDone = true; } catch (RemoteException e) { if (listener != null) { listener.onIabSetupFinished(new IabResult(IABHELPER_REMOTE_EXCEPTION, "RemoteException while setting up in-app billing.")); } e.printStackTrace(); return; } if (listener != null) { listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Setup successful.")); } } }; Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) { // service available to handle that Intent mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); } else { // no service available to handle that Intent if (listener != null) { listener.onIabSetupFinished( new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, "Billing service unavailable on device.")); } } }
和IabHelper的构造函数:
public IabHelper(Context ctx, String base64PublicKey) { mContext = ctx.getApplicationContext(); mSignatureBase64 = base64PublicKey; logDebug("IAB helper created."); }
这里是完整的IabHelper类.
概括:
告诉我你是否可以看到抛出变量的位置/时间.NullPointerException
mHelper
我无法从代码中测试并使用虚拟和物理设备进行测试,因为工作正常.
我非常确定在Activity关闭后抛出错误但我不明白为什么要修复它.
如果您需要更多信息,请写信.谢谢大家!