我正在尝试在我的应用中实现应用内结算API,但是当我运行我的应用时,它会产生异常。这是我第一次使用应用内结算API。这是我得到的异常的日志:
Process: koemdzhiev.com.quickshoppinglist, PID: 10604
java.lang.RuntimeException: Unable to start activity ComponentInfo{koemdzhiev.com.quickshoppinglist/koemdzhiev.com.quickshoppinglist.ui.MainActivity}: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2329)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
at android.app.ActivityThread.access$900(ActivityThread.java:147)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Caused by: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
at koemdzhiev.com.quickshoppinglist.utils.IabHelper.checkSetupDone(IabHelper.java:782)
at koemdzhiev.com.quickshoppinglist.utils.IabHelper.queryInventoryAsync(IabHelper.java:610)
at koemdzhiev.com.quickshoppinglist.utils.IabHelper.queryInventoryAsync(IabHelper.java:639)
at koemdzhiev.com.quickshoppinglist.ui.MainActivity.queryPurchasedItems(MainActivity.java:187)
at koemdzhiev.com.quickshoppinglist.ui.MainActivity.onStart(MainActivity.java:193)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
我在主要活动中的代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private Toolbar mToolbar;
private RecyclerView mRecyclerView;
private ArrayList<String> shoppingListItems;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private TextView mEmptyTextView;
private ShoppingListAdapter adapter;
private ActionButton actionButton;
private MaterialDialog addItemdialog = null;
private AdView mAdView;
private IabHelper mHelper;
private String SKU_REMOVE_ADDS = "remove_adds_sku";
private boolean mIsRemoveAdds = false;
private IabHelper.OnIabPurchaseFinishedListener mPurchasedFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
else if (purchase.getSku().equals(SKU_REMOVE_ADDS)) {
// consume the gas and update the UI
mIsRemoveAdds = true;
mAdView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String publicKey = s1+s2+s3+s4+s5;
mHelper = new IabHelper(this,publicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
//error
Log.d(TAG, "Proglem setting up in-app Billing: " + result);
}
//Horay, IAB is fully set up!
Log.d(TAG, "Horay, IAB is fully set up!");
queryPurchasedItems();
}
});
private void queryPurchasedItems() {
//check if user has bought "remove adds"
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
// handle error here
Toast.makeText(MainActivity.this,"error",Toast.LENGTH_LONG).show();
}
else{
// does the user have the premium upgrade?
mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
if(!mIsRemoveAdds) {
Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show();
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}else{
mAdView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show();
}
}
}
};
mHelper.queryInventoryAsync(mGotInventoryListener);
}
@Override
protected void onStart() {
super.onStart();
queryPurchasedItems();
isListEmpty();
}
@Override
protected void onResume() {
super.onResume();
queryPurchasedItems();
isListEmpty();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
mAdView.destroy();
}
答案 0 :(得分:23)
最后,我得到了整个工作,并没有得到这个异常“IAB助手没有设置。无法执行操作:queryInventory”或我得到的另一个“无法启动异步操作(消耗)因为另一个异步操作(消耗)正在进行中。“
您要做的第一件事是在IabHelper.java类中添加2个方法:
public boolean isAsyncInProgress(){
return mAsyncInProgress;
}
public boolean isSetupDone (){
return mSetupDone;
}
而不是你的主要活动:
public class MainActivity extends AppCompatActivity {
private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
// handle error here
Toast.makeText(MainActivity.this,"error",Toast.LENGTH_LONG).show();
}
else{
// does the user have the premium upgrade?
mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
if(!mIsRemoveAdds) {
Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show();
mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}else{
mAdView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show();
}
}
}
};
private IabHelper.OnIabPurchaseFinishedListener mPurchasedFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
else if (purchase.getSku().equals(SKU_REMOVE_ADDS)) {
// consume the gas and update the UI
mIsRemoveAdds = true;
mAdView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"Purchase successful",Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String publicKey = s1+s2+s3+s4+s5;
mHelper = new IabHelper(this,publicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
//error
Log.d(TAG, "Proglem setting up in-app Billing: " + result);
}
if (result.isSuccess()) {
//Horay, IAB is fully set up!
Log.d(TAG, "Horay, IAB is fully set up!");
//queryPurchasedItems;
mHelper.queryInventoryAsync(mGotInventoryListener);
}
}
});
现在,正如Google guide建议的那样,我们必须检查用户在开始或简历方法中购买了哪些商品。在这里,我们需要在IabHelper.java类中添加两种方法。
private void queryPurchasedItems() {
//check if user has bought "remove adds"
if(mHelper.isSetupDone() && !mHelper.isAsyncInProgress()) {
mHelper.queryInventoryAsync(mGotInventoryListener);
}
}
@Override
protected void onStart() {
super.onStart();
queryPurchasedItems();
}
@Override
protected void onResume() {
super.onResume();
queryPurchasedItems();
isListEmpty();
}
答案 1 :(得分:1)
您的OnIabSetupFinishedListener会检查 (!result.isSuccess())
但是如果结果不成功,你不会返回或中止。
我认为你的mHelper.startSetup失败了,你没有处理这个失败。