在活动开始时验证购买

问题描述

我想在应用首次运行时验证应用内购买,并向用户授予无广告版本的访问权限。用户已经购买了该应用程序(非消耗品)。我正在使用Google Play结算库,当用户单击“删除广告”按钮时,以下代码有效。我在个人偏好中存储了一个标记 IS_PURCHASED 以检查购买状态。重新安装该应用程序会显示广告,因为它无法设置标志,但是当我单击“删除广告”时,它会按预期显示“已购买”。

MainActivity onCreate()方法

        //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);
        }

菜单删除广告”设置一个标记

@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;
    }

方法实施

 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,true);
            }*/
            //Get purchase ackNowledgement
            if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
                settings.saveBoolean(MainActivity.this,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,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);
                    }
                }
            }
        });
    }

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

谢谢!

解决方法

好,我找到了解决方案。您可以使用 queryPurchases 方法检查已购买的应用。我也在错误的地方设置了标志。如果有人遇到相同的问题,请在 onBillingSetupFinished

中调用以下方法
    //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;
    }