应用内购买移除广告 - Android/Kotlin
In-App Purchase to Remove Ads - Android/Kotlin
我在 Google 商店(在 Kotlin 中)上有一些使用 AdMob 的应用,现在我想添加应用内购买以移除广告。
我一直在寻找一些好的教程,但没有结果,因为它们都很旧(2016-2017)。
谁能指导我,如何实现这个?
我知道我可以使用 SharedPreferences,但如果有人重新安装我的应用程序或删除内存,他将丢失购买的项目。
感谢大家的帮助!
@编辑
购买在我的 MainActivity 中,用户应该可以在点击 ID 为 "noAdsButton" 且我的产品 ID 在 Google 中的按钮后购买移除广告 Play it's "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?")
如果有人重新安装您的应用程序丢失了购买的项目,但he/she可以免费再次购买。我为此使用了 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();
}
});
}
我在 Google 商店(在 Kotlin 中)上有一些使用 AdMob 的应用,现在我想添加应用内购买以移除广告。 我一直在寻找一些好的教程,但没有结果,因为它们都很旧(2016-2017)。
谁能指导我,如何实现这个? 我知道我可以使用 SharedPreferences,但如果有人重新安装我的应用程序或删除内存,他将丢失购买的项目。
感谢大家的帮助!
@编辑 购买在我的 MainActivity 中,用户应该可以在点击 ID 为 "noAdsButton" 且我的产品 ID 在 Google 中的按钮后购买移除广告 Play it's "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?")
如果有人重新安装您的应用程序丢失了购买的项目,但he/she可以免费再次购买。我为此使用了 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();
}
});
}