首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在活动开始时核实购买

在活动开始时核实购买
EN

Stack Overflow用户
提问于 2020-10-06 11:26:57
回答 1查看 452关注 0票数 1

当应用程序第一次运行时,我想验证应用内购买&授予用户无广告版本的访问权限。用户已经购买了应用程序(非消耗品)。我正在使用Google计费库,当用户单击“删除广告”按钮时,下面的代码正在工作。我在pref中存储一个标志IS_PURCHASED以检查购买状态。重新安装这个应用程序会显示广告,因为它不能设置标志,但是当我点击“删除广告”时,它说“已经购买了”。

MainActivity onCreate()方法

代码语言:javascript
复制
        //Method storing the flag IS_PURCHASED
         setupBillingClient();
        //Setup Google billing client for app's first run
        if(settings.isFirstRun()) {
            removeAds(); 
            drawer.openDrawer(Gravity.LEFT);
        }
        Boolean isPurchased = settings.getBoolean(MainActivity.this, "IS_PURCHASED");
        RelativeLayout bottomAd = findViewById(R.id.rowAdView);
        if(isPurchased) {
            bottomAd.setVisibility(View.GONE);
        }else{
            //Load banner ad
            mBannerAd = (AdView) findViewById(R.id.banner_AdView);
            AdRequest adRequest = new AdRequest.Builder().build();
            mBannerAd.loadAd(adRequest);
        }

菜单删除设置标志的广告

代码语言:javascript
复制
@Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Intent intent;
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        Intent intentExpr;
        String expr;
        switch (id) { 
    //Remove Ads and store flag IS_PURCHASED in pref 
            case R.id.nav_remove_ads:
                removeAds();
                break;
           //other cases
      
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

方法实现

代码语言:javascript
复制
 public void setupBillingClient(){
        //To create a BillingClient, use newBuilder(). To receive updates on purchases, we must also call setListener(),
        // passing a reference to a PurchasesUpdatedListener. This listener receives updates for all purchases of this app.
        billingClient = BillingClient.newBuilder(MainActivity.this).enablePendingPurchases().setListener(new PurchasesUpdatedListener() {
            @Override
            //This method starts when user buys a product
            public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> list) {
                if(list != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
                {
                    for(Purchase purchase : list)
                    {
                        handlePurchase(purchase);
                    }
                }
                else
                {
                    if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED)
                    {
                        Toast.makeText(MainActivity.this, "Please try purchasing again", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED)
                        {
                            settings.saveBoolean(MainActivity.this, "IS_PURCHASED", true);
                            if(!settings.isFirstRun()) { //show msg for remove ad button click & not when reinstall
                                recreate(); //restart Activity to hide ads
                                Toast.makeText(MainActivity.this, "Already purchased", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }
            }
        }).build();

        //After you have created a BillingClient, we need to establish a connection to Google Play.
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
                {
                    Log.d("MainActivity", "Successfully connected to Billing client");
                }
                else
                {
                    Log.d("MainActivity", "Failed to connect Billing client");
                }
            }
            @Override
            public void onBillingServiceDisconnected() {
                Log.d("MainActivity", "Disconnected from the Client");
            }
        });

    }

    private void handlePurchase(Purchase purchase) {
        try {
            //On purchase set IS_PURCHASED true
            /*if(purchase.getSku().equals(productId)){
                settings.saveBoolean(MainActivity.this, "IS_PURCHASED", true);
            }*/
            //Get purchase acknowledgement
            if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
                settings.saveBoolean(MainActivity.this, "IS_PURCHASED", true); //In case purchase was acknowledge before
                if (!purchase.isAcknowledged()) {
                    AcknowledgePurchaseParams acknowledgePurchaseParams =
                            AcknowledgePurchaseParams.newBuilder()
                                    .setPurchaseToken(purchase.getPurchaseToken())
                                    .build();
                    AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() {
                        @Override
                        public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
                            settings.saveBoolean(MainActivity.this, "IS_PURCHASED", true);
                            recreate(); //restart activity on acknowledgement of purchase
                            Toast.makeText(MainActivity.this, "Purchase successful! Enjoy the Ad-Free version", Toast.LENGTH_SHORT).show();
                        }
                    };
                    billingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
                }else{
                    recreate(); //restart activity if already acknowledged
                }
            }
        }
        catch (Exception e)
        {
            Log.d(TAG, e.getMessage());
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    public void removeAds(){
        skulist.add(productId);
        final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skulist).setType(BillingClient.SkuType.INAPP);
        billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
                if(list != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK)
                {
                    for(final SkuDetails skuDetails : list)
                    {
                        String sku = skuDetails.getSku(); // your Product id
                        String price = skuDetails.getPrice(); // your product price
                        String description = skuDetails.getDescription(); // product description
                        //method opens Popup for billing purchase
                        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                .setSkuDetails(skuDetails)
                                .build();
                        BillingResult responsecode = billingClient.launchBillingFlow(MainActivity.this,flowParams);
                    }
                }
            }
        });
    }

还建议是否还有其他更好的方法。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-10-13 11:44:18

我找到了解决办法。您可以使用queryPurchases方法检查已经购买的应用程序。我也把旗子放错地方了。如果有人面临同样的问题,请在onBillingSetupFinished中调用以下方法

代码语言:javascript
复制
    //Check already purchases using queryPurchases
    private boolean isAlreadyPurchased() {
        if (billingClient.isReady()) {
            Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP);
            List<Purchase> purchases = purchasesResult.getPurchasesList();
            for (Purchase pur : purchases) {
                String thisSku = pur.getSku();
                if (thisSku.equals(sku)) {
                    return true;
                }
            }
        }
        return false;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64224837

复制
相关文章

相似问题

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