Покупка из приложения для удаления рекламы - Android / Kotlin - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть приложение в Google Store (в Kotlin) с AdMob, и теперь я хочу добавить покупку в приложении, чтобы удалить рекламу. Я искал хороший учебник, но безрезультатно, потому что все они очень старые (2016-2017).

Кто-нибудь может мне помочь, как это реализовать? Я знаю, что могу использовать SharedPreferences, но если кто-то переустановит мое приложение или удалит память, он потеряет купленный предмет.

Спасибо, ребята, за помощь!

@ Edit Покупка осуществляется в моей основной деятельности, пользователь должен купить «Удалить рекламу» после нажатия на кнопку с идентификатором «noAdsButton» и идентификатором для моего продукта в Google Play - «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 («что здесь?»)

1 Ответ

1 голос
/ 22 апреля 2020

, если кто-то переустанавливает ваше приложение, потерял купленный предмет, но он / она может купить снова бесплатно . Я использую 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();
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...