Android在app中购买耗材产品

时间:2014-08-22 17:33:31

标签: android in-app-purchase in-app-billing

我已经在我的应用程序中实现了应用内购买,我的产品类型是托管的,我使用的是API版本3。 当我从我的信用卡购买时,它已成功完成。 但问题是,如果我卸载我的应用程序并想用相同的帐户购买它会再次向我收费? 根据谷歌管理产品类型的规则,我们只购买一次产品?但为什么会这样呢? 有人帮我吗? 这是我的PurchaseActivity.java类

public abstract class PurchaseActivity extends BlundellActivity implements OnIabSetupFinishedListener, OnIabPurchaseFinishedListener {

    private IabHelper billingHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_purchase);
        setResult(RESULT_CANCELED);

        billingHelper = new IabHelper(this, AppProperties.BASE_64_KEY);
        billingHelper.startSetup(this);
    }

    @Override
    public void onIabSetupFinished(IabResult result) {
        if (result.isSuccess()) {
            Log.d("In-app Billing set up" + result);
            dealWithIabSetupSuccess();
        } else {
            Log.d("Problem setting up In-app Billing: " + result);
            dealWithIabSetupFailure();
        }
    }

    protected abstract void dealWithIabSetupSuccess();

    protected abstract void dealWithIabSetupFailure();

    protected void purchaseItem(String sku) {
        billingHelper.launchPurchaseFlow(this, sku, 123, this);
    }

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


     */
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {
        if (result.isFailure()) {
            dealWithPurchaseFailed(result);
        } else if (pmg.SKU.equals(info.getSku())) {
            dealWithPurchaseSuccess(result, info);
        }
        finish();
    }

    protected void dealWithPurchaseFailed(IabResult result) {
        Log.d("Error purchasing: " + result);
    }

    protected void dealWithPurchaseSuccess(IabResult result, Purchase info) {
        Log.d("Item purchased: " + result);
        // DEBUG XXX
        // We consume the item straight away so we can test multiple purchases
        billingHelper.consumeAsync(info, null);
        // END DEBUG
    }

    @Override
    protected void onDestroy() {
        disposeBillingHelper();
        super.onDestroy();
    }

    private void disposeBillingHelper() {
        if (billingHelper != null) {
            billingHelper.dispose();
        }
        billingHelper = null;
    }
}

1 个答案:

答案 0 :(得分:1)

这是按预期工作 - 在您的代码中,您立即消费应用内购买,这意味着您可以再次购买它:

protected void dealWithPurchaseSuccess(IabResult result, Purchase info) {
    Log.d("Item purchased: " + result);
    // DEBUG XXX
    // We consume the item straight away so we can test multiple purchases
    billingHelper.consumeAsync(info, null);
    // END DEBUG
}

没有任何迹象表明您不能多次购买托管产品。您无法执行的操作是在上次购买相同的托管项目之前购买托管产品 。这样就完全符合预期,如果您将该通话移至consumeAsync,您就会发现无法再次购买。

示例用例:

想象一下你可以购买额外生命的游戏。首先,用户将购买额外的生命(管理的应用程序产品),然后您的游戏(客户端或服务器)会将这些生命添加到用户的配置文件中,并假设成功,您和#39 ; d告诉Google Play购买已被消费。

这对于处理错误情况很重要 - 例如,假设用户的设备在初始购买和添加生命之间死亡到用户的配置文件。然后,您的应用可以在下次启动时再次尝试添加这些生命,并在成功时消费购买。并且,显然您不希望用户在成功授予他们之前尝试购买更多生命 - 这就是为什么您无法在被销售产品被消费之前购买两次。