在App Purchase中似乎被多次调用

Flo*_*her 1 android in-app-billing play-billing-library

我根据Google的教程使用Play Billing Library 1.0实现了应用程序内购买.我只有1件商品可以购买,当它解锁时,我会显示一个Toast.LENGTH_SHORT长度的Toast消息.然而,Toast在那里呆了10秒钟,所以我认为它被多次调用.当我通过queryPurchases(如果有人先前购买并在此期间重新安装应用程序)解锁时,它不会发生.

任何人都知道为什么Toast会停留这么久/为什么它被多次调用?

在我的BillingManager类中:

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK) {
        for (Purchase purchase : purchases) {
            handlePurchases(purchase);
        }
        mBillingUpdatesListener.onPurchasesUpdated(mPurchases);
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {

    } else {

    }
}

public void handlePurchases(Purchase purchase) {
    //here could be validation on own server

    mPurchases.add(purchase);
}
Run Code Online (Sandbox Code Playgroud)

主Activity实现BillingUpdatesListener:

@Override
public void onPurchasesUpdated(List<Purchase> purchases) {
    for (Purchase purchase : purchases) {
        switch (purchase.getSku()) {
            case "premium":
                unlockPremium();
                break;
        }
    }
}

public void unlockPremium() {
    mPremiumUnlocked = true;
    savePremiumUnlocked();
    Toast.makeText(this, getResources().getString(R.string.premium_congrats), Toast.LENGTH_SHORT).show();
    mAdView.setVisibility(GONE);
}
Run Code Online (Sandbox Code Playgroud)

Kuf*_*ffs 5

如果我理解正确,你会说当你第一次购买应用内商品时,你会得到多个Toast?

在Billing库的当前版本(1.0)中,发生这种情况是因为系统正在进行多个广播.

例如,如果您在库onPurchaseFinishedReceiver中的第120行查看或断点BillingClientImpl.java,则在购买后至少调用两次.两次都附上了应用内购买数据,但我注意到Action每个广播的意图都不同.

在第一次广播中,行动com.android.vending.billing.PURCHASES_UPDATED只是在第二次广播中proxy_activity_response_intent_action.该库不会过滤掉Action值,因此所有这些广播都会导致您purchasesUpdatedListener被调用.

我没有进一步调查,但我认为我们可以从中得到的是,发生了某种变化,并认为有必要广播这一变化.

为避免多次敬酒,除非您的Premium功能已解锁,否则不要显示Toast.即如果它已经解锁,则只需忽略更改通知.

顺便说一句,完全有可能在Android Studio中调试购买流程.只需使用您的发布密钥签署您的调试apk,并确保apk版本不高于Play商店中的版本.

buildTypes {

    debug {
        minifyEnabled false
        debuggable true
        signingConfig signingConfigs.release
    }


    release {
        minifyEnabled false
        signingConfig signingConfigs.release
    }
}
Run Code Online (Sandbox Code Playgroud)