#android #android-inapp-purchase #play-billing-library
#Android #android-inapp-покупка #play-биллинг-библиотека
Вопрос:
Я хочу проверить покупку в приложении, когда приложение запускается в первый раз, и предоставить пользователю доступ к версии без рекламы. Пользователь уже приобрел приложение (не расходуется). Я использую биллинговую библиотеку Google Play, приведенный ниже код работает, когда пользователь нажимает на кнопку удаления рекламы. Я сохраняю флаг IS_PURCHASED в pref, чтобы проверить статус покупки. Переустановка приложения показывает рекламу, поскольку оно не может установить флаг, но когда я нажимаю «Удалить рекламу», оно говорит «Уже куплено», как и ожидалось.
Метод 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 amp;amp; 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 amp; 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 amp;amp; 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);
}
}
}
});
}
Также предложите, есть ли какой-либо другой способ лучше, чем этот.
Заранее спасибо!
Комментарии:
1. Пожалуйста, разместите код вопроса правильно.
Ответ №1:
Ну, я нашел решение. Вы можете проверить, что приложение уже приобретено, используя метод 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;
}