首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卸载后恢复购买

卸载后恢复购买
EN

Stack Overflow用户
提问于 2017-04-03 00:42:29
回答 1查看 111关注 0票数 0

我可以在我的代码中执行应用程序中的计费。然而,如果我安装应用程序,并重新进行购买,它会再次购买。

问题出在哪里?

以下是代码:

代码语言:javascript
复制
        case R.id.action_disable_ads:
            try {
                mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,
                        mPurchaseFinishedListener);
            } catch (IabHelper.IabAsyncInProgressException e) {
                //e.printStackTrace();
            }
            return true;
    }

    return super.onOptionsItemSelected(item);
}

//functions special for in App Billing
@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data)
{
    if (!mHelper.handleActivityResult(requestCode,
            resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

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 consumeItem() {
    try {
        mHelper.queryInventoryAsync(mReceivedInventoryListener);
    } catch (IabHelper.IabAsyncInProgressException e) {
        //e.printStackTrace();
    }
}

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {

        if (result.isFailure()) {
            // Handle failure
        } else {
            try {
                mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                        mConsumeFinishedListener);
            } catch (IabHelper.IabAsyncInProgressException e) {
                //e.printStackTrace();
            }
        }
    }
};

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                    //first save purchase state
                    SharedPreferences settings = getPreferences(0);
                    SharedPreferences.Editor settingsEditor = settings.edit();
                    settingsEditor.putString("adfree", "purchased");
                    settingsEditor.apply();
                    //then, hide the disable ads button
                    MenuItem disableAds = mainMenu.findItem(R.id.action_disable_ads);
                    disableAds.setVisible(false);
                    //then display a message that the transaction is successful
                    Toast.makeText(getApplicationContext(), "AdFree bundle purchased successfully!", Toast.LENGTH_SHORT).show();
                    //then change the state of ad-free bundle for current session:
                    adFreeBundle = "purchased";
                    //then disable ads
                    interstitialAd = null;
                    mAdView.setVisibility(View.GONE);

                } else {
                    //display an error message that the transaction was not successful
                    AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

                    builder.setTitle("TRANSACTION FAILED!");
                    builder.setMessage("Unfortunately, the transaction was unsuccessful!");

                    builder.setPositiveButton("CLOSE", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int which) {
                            // Do nothing but close the dialog
                            dialog.dismiss();
                        }
                    });

                    final AlertDialog alert = builder.create();
                    alert.setOnShowListener(new     DialogInterface.OnShowListener() {
                        @Override
                        public void onShow(DialogInterface arg0) {
                                alert.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.parseColor("#000000"));
                        }
                    });
                    alert.show();
                }
            }
        };

@Override
public void onDestroy() {
    super.onDestroy();
    if (mHelper != null) try {
        mHelper.dispose();
    } catch (IabHelper.IabAsyncInProgressException e) {
        //e.printStackTrace();
    }
    mHelper = null;
}

应用程序计费的过程运作得很好。不过,我会很高兴尝试获得购买的项目后,重新安装的应用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 02:31:10

这是因为您正在消费购买,并在sharedPreferences中设置一个标志。

--不要这样做--任何人都可以使用正确的工具更改sharedPreferences。

当你卸载你的应用程序,你的sharedPreferences将重置,你将失去你的‘购买’。

因为您消费了该项目,在第二次尝试您的库存将没有正确的SKU可用,这就是为什么您是迅速购买再次。

如果您使购买按钮始终可见,您将被要求支付每次点击。

来修复这个

不要使用该项,最重要的是不要在sharedPreferences中设置任何标志。这也适用于sql数据库。

消费并不意味着用于非消费项目,这就是你的情况,因为你是在向用户收取删除广告的费用,如果你尝试使用这个,你的用户就不会很高兴了。

当您的应用程序开始检查您的库存,如果您的库存有正确的SKU,然后给用户的产品。

代码语言:javascript
复制
 mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        @Override
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                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.");
            try {
                mHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
                    @Override
                    public void onQueryInventoryFinished(IabResult result, Inventory inv) {
                        handleInventory(result, inv);
                    }
                });
            } catch (IabHelper.IabAsyncInProgressException e) {
                complain("Error querying inventory. Another async operation in progress.");
                e.printStackTrace();
            }
        }
    });

 public void handleInventory(IabResult result, Inventory inventory) {       
    if (mHelper == null) return;

    // Is it a failure?
    if (result.isFailure()) {          
        return;
    }

    Log.d(TAG, "Query inventory was successful.");
    Purchase premiumPurchase = inventory.getPurchase(YOUR SKU);
    //verify Developer Payload here, it's recommended but not mandatory.
    //mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
    mIsPremium = premiumPurchase != null;

    if (mIsPremium) {           
        //Enable feature 
    }else{
        //Disable feature 
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43175057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档