我正在尝试使用Google Play中的静态产品ID设置应用内结算并进行测试。 我正在关注开发人员教程here。 当在labHelper对象上调用了launhPurcahseFlow方法时,我得到了异常:
java.lang.IllegalStateException:未设置IAB助手。不能 执行操作:launchPurchaseFlow at com.android.vending.billing.IabHelper.checkSetupDone(IabHelper.java:782)
一直在搜索数小时,找不到有效的解决方案。 任何意见都赞赏。
我的代码是:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// compute your public key and store it in base64EncodedPublicKey
mHelper = new IabHelper(this, base64EncodedPublicKey);
// enable debug logging (for a production application, you should set this to false).
mHelper.enableDebugLogging(true);
//perform service binding to Google Bill ser and return ny errors with IabResult object and listener
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
alert("Problem setting up in-app billing: " + result);
return;
}
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null) return;
// IAB is fully set up. Now, let's get an inventory of stuff we own.
Log.d(TAG, "Setup successful. Querying inventory.");
//mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
//ILLEGALSTAEEXCEPTION THROWN HERE
mHelper.launchPurchaseFlow(this, testProduct, RC_REQUEST,
new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase)
{
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
else if (purchase.getSku().equals(testProduct)) {
// give user access to premium content and update the UI
//set the purchaesd booean to true
//when purcajsed add this code
editor.putBoolean("purchased", true);
editor.commit();
Toast.makeText(getApplicationContext(), "ADD FREE VERSION PURCAHSED!!!" +
" Details OrderID: "+purchase.getOrderId() +" Payload ID: "+purchase.mDeveloperPayload, Toast.LENGTH_LONG).show();
Log.d("CONNECT TO GOOGLE BILL", "ITEM PURCAHSED! : "+purchased);
}
}
}, "diveAppPurchase");
}//onCreate
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (mHelper == null) return;
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
答案 0 :(得分:3)
这对像我这样的人来说很有用,他们正在第一次购买应用程序。
设置调用是异步的,因此必须在调用launchPurchaseFlow之前完成。所以我禁用了“购买”按钮来进行launchPurchaseFlow调用,该调用在设置调用完成后启用。工作正常:
设置通话 //对Google Bill ser执行服务绑定,并使用IabResult对象和侦听器返回ny错误
mHelper.startSetup(...)
如果成功则启用按钮并调用mHelper.launchPurchaseFlow(...)方法
此外,当使用谷歌提供的测试产品ID时,您可能会注意到在launchPurchaseFlow期间抛出签名异常,但后续结果失败,尽管交易成功,这显然是谷歌知道的已知错误