【问题标题】:In-App Purchase to Remove Ads - Android/Kotlin应用内购买以删除广告 - Android/Kotlin
【发布时间】:2020-08-05 08:12:22
【问题描述】:

我在 Google 商店(在 Kotlin 中)有一些带有 AdMob 的应用,现在我想添加应用内购买来删除广告。 我一直在寻找一些好的教程,但没有结果,因为它们都太老了(2016-2017)。

谁能指导我,如何实现这个? 我知道我可以使用 SharedPreferences,但如果有人重新安装我的应用程序或删除内存,他将丢失购买的项目。

感谢大家的帮助!

@编辑 购买在我的 MainActivity 中,用户应该可以在点击按钮后购买 Remove Ads,其 id 为“noAdsButton”,我的产品在 Google Play 中的 id 为“no_ads”

 private lateinit var mBillingClient: BillingClient


...



    open fun onPurchasesUpdated(
        billingResult: BillingResult,
        list: List<Purchase>?
    ): Unit {
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK
            && list != null
        ) {
            for (purchase in list) {
                if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
                    if (!purchase.isAcknowledged) {
                        val acknowledgePurchaseParams =
                            AcknowledgePurchaseParams.newBuilder()
                                .setPurchaseToken(purchase.purchaseToken)
                                .build()
                        mBillingClient.acknowledgePurchase(
                            acknowledgePurchaseParams,
                            AcknowledgePurchaseResponseListener { billingResult ->
                                if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                                    Toast.makeText(
                                        this@MainActivity,
                                        "Ads Removed",
                                        Toast.LENGTH_SHORT
                                    ).show()
                                    preferences.edit().putBoolean("show_ads", false).apply()
                                    startActivity(
                                        Intent(
                                            this@MainActivity,
                                            MainActivity::class.java
                                        )
                                    )
                                    finish()
                                } else {
                                    Toast.makeText(
                                        this@MainActivity,
                                        "Error",
                                        Toast.LENGTH_LONG
                                    ).show()
                                }
                            })
                    }
                }
            }
        } else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
            Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show()
        } else if (billingResult.responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
            preferences.edit().putBoolean("show_ads", false).apply()
            Toast.makeText(this, "Ads removed because you buy before", Toast.LENGTH_LONG).show()
        } else {
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show()
        }
    }

当我想开始购买时,我应该在按钮上设置 onClickListener 并启动函数 onPurchasesUpdated("what here?")

【问题讨论】:

    标签: android kotlin in-app-purchase ads


    【解决方案1】:

    如果有人重新安装您的应用丢失了购买的商品,但他/她可以免费再次购买。我为此使用 SharedPreferences 并且它有效。

    您可以使用 ITEM_ALREAY_OWNED 方法进行控制

    if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
        preferences.edit().putBoolean("show_ads", false).apply();
        Toast.makeText(this, "Ads removed because you buy before", Toast.LENGTH_LONG).show();
       }
    

    和所有

     @Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> list) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                && list != null) {
            for (Purchase purchase : list) {
                if(purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED){
                    if(!purchase.isAcknowledged()){
                        AcknowledgePurchaseParams acknowledgePurchaseParams =
                                AcknowledgePurchaseParams.newBuilder()
                                        .setPurchaseToken(purchase.getPurchaseToken())
                                        .build();
                        mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
                            @Override
                            public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
                                if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK) {
                                    Toast.makeText(MainActivity.this, "Ads Removed", Toast.LENGTH_SHORT).show();
                                    preferences.edit().putBoolean("show_ads", false).apply();
                                    startActivity(new Intent(MainActivity.this, MainActivity.class));
                                    finish();
                                }else{
                                    Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_LONG).show();
                                }
                            }
                        });
                    }
    
                }
            }
        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
            Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show();
        } else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
            preferences.edit().putBoolean("show_ads", false).apply();
            Toast.makeText(this, "Ads removed because you buy before", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
        }
    
    }
    

    及设置计费方式

        private void setupBilling() {
        mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener(this).enablePendingPurchases().build();
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() ==  BillingClient.BillingResponseCode.OK) {
                    Toast.makeText(MainActivity.this, "Ödeme sistemi etkin", Toast.LENGTH_SHORT).show();
    
                    final List<String> skuList = new ArrayList<> ();
                    skuList.add("remove_ads");
                    final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
                    mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
                        @Override
                        public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
                            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
                                BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                        .setSkuDetails(list.get(0))
                                        .build();
                                mBillingClient.launchBillingFlow(MainActivity.this, flowParams);
                            }
                        }
                    });
                }else{
                    Toast.makeText(MainActivity.this, "Ödeme sistemi için google play hesabını kontrol ediniz", Toast.LENGTH_SHORT).show();
                }
            }
            @Override
            public void onBillingServiceDisconnected() {
                Toast.makeText(MainActivity.this, "Ödeme sistemi şuanda geçerli değil", Toast.LENGTH_SHORT).show();
            }
        });
    }
    

    【讨论】:

    • 我正在尝试为我的应用重新编写您的代码,但有些人认为出错了。我不知道您为 mBillingClient 实施了什么,以及您在哪里拥有 id 产品。我将编辑我的问题并添加更多信息,这将有助于理解我的问题。 :)
    • 我添加了 setupBilling 方法来回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多