2017-07-26 93 views
3

我正在学习如何实现基于本文的应用内结算 - http://www.techotopia.com/index.php/Integrating_Google_Play_In-app_Billing_into_an_Android_Application_%E2%80%93_A_Tutorial的Android应用内结算,不良反应-1002

每次我尝试运行这个程序在调试模式下我的错误,指出“谷歌Play商店”已经崩溃了,我的日志说

E/InAppBilling: In-app billing error: Null data in IAB activity result.

Error: Error purchasing: labResult: Null data in IAB result (response: -1002: Bad response received)

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getBuyIntent(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference

HERE I GOT MY ERROR

而且我已经成功地运行名为琐碎的驱动器在发布模式下谷歌的样品,但是当我代替真正的SKU与试验之一(例如android.test.purchased)和在DEBUG模式下运行应用程序我得到了同样的错误。

全部活动代码

public class InAppBillingActivity extends AppCompatActivity { 
private Button clickButton; 
private Button buyButton; 

private static final String TAG = "InAppBilling"; 
IabHelper mHelper; 

static final String ITEM_SKU = "android.test.purchased"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.billing_activity); 
    buyButton = (Button)findViewById(R.id.buyButton); 
    clickButton = (Button)findViewById(R.id.clickButton); 
    clickButton.setEnabled(false); 

    String base64EncodedPublicKey = "HERE IS MY KEY FROM DEVELOPER CONSOLE"; 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     @Override 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       Log.d(TAG, "In-app Billing setup failed:" + result); 
      } else { 
       Log.d(TAG, "In-app Billing is set up OK"); 
       mHelper.enableDebugLogging(true, TAG); 
      } 
     } 
    }); 
} 

public void buttonClicked (View view) { 
    clickButton.setEnabled(false); 
    buyButton.setEnabled(true); 
} 

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
     if (result.isFailure()) {// Handle error 
      return; 
     } 
     else if (purchase.getSku().equals(ITEM_SKU)) { 
      consumeItem(); 
      buyButton.setEnabled(false); 
     } 
    } 
}; 

public void buyClick(View view) { 
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001, mPurchaseFinishedListener, "mypurchasetoken"); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (!mHelper.handleActivityResult(requestCode, 
      resultCode, data)) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

public void consumeItem() { 
    mHelper.queryInventoryAsync(mReceivedInventoryListener); 
} 

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
     if (result.isFailure()) { 
      // Handle failure 
     } else { 
      mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener); 
     } 
    } 
}; 

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 
     if (result.isSuccess()) { 
      clickButton.setEnabled(true); 
     } else { 
      // handle error 
     } 
    } 
}; 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mHelper != null) mHelper.dispose(); 
    mHelper = null; 
} 
+0

ITEM_SKU是您要购买的订阅或被管理的产品? –

+0

说实话,我不知道,我认为它是托管产品,谷歌静态测试SKU的托管/子产品没有分离。其他变量是 - android.test.cancelled,android.test.refunded和android.test.item_unavailable。 –

+0

但是您在测试产品时说过,如果产品出现错误,您的产品运行会非常好。 –

回答

3

嘿这仅仅是因为新的谷歌Play商店更新发生。
你已经完成了所有的事情

因此,没有必要对这次事故做任何事情。只需等待Google Play商店应用程序中的错误修复。

为模式的详细信息,您可以检查此question

编辑:在新的谷歌Play商店的版本2017年8月11日
现在8.0.73.R,所有[0] [PR] 162689464谷歌修复崩溃问题,我已经成功地在我的设备上测试过,所以现在你不再面临这个问题。 :)

0

从你的日志,我认为你是发出错误的参数。 在我的应用程序

对于管理产品我用这些参数

mHelper.launchPurchaseFlow(this, SKU, PURCHASE_REQUEST, mPurchaseFinishedListener, payload); 

对于订购产品我用这些参数

mHelper.launchPurchaseFlow(this, SKU, IabHelper.ITEM_TYPE_SUBS, oldSkus, PURCHASE_REQUEST, mPurchaseFinishedListener, payload); 

尝试这些可能帮助你..

+0

感谢您的尝试,但它不起作用,请参阅https://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static“android.test.purchased”static SKU can不会被归类为托管/订阅产品,因此我们的参数是相同的。 –

+0

你解决了你的问题吗? –

+1

不幸的是,似乎Harin Kaklotar的回答是正确的,我只能等待谷歌解决这个问题。 –