Android In-app Billing (Uygulama İçi Satın Alma)

Merhaba arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız / yayınladığımız Android Ders’lerine bu dersimizde android geliştiricilerinin çok fazla ihtiyaç duyduğu Uygulama İçi Satın Alma in-app billing konusunu anlatacağız.

Bu dersi bizler için hazırlayan Gökhan Musapasaoğlu arkadaşımıza teşekkür ediyorum. Gerçekten hazırlaması çok zahmetli bir ders. Emeği için teşekkürler..

ÖNEMLİ:Derse başlamadan önce şu uyarıda bulunmak istiyorum.  Uygulama içi satın alımları yapmanız ve test edebilmeniz için uygulamanızı GoogleStore’a Alpha ya da Beta olarak publish etmiş olmanız gerekiyor.

In-app Billing Google Play Ayarları

Burada başta dediğim gibi Google Play’e uygulamamızı beta yada alpha olarak publish etmemiz gerekiyor. Aksi taktirde satın alma işlemi gerçekleştirirken ekrandaki gibi hata alacaksınız.

Google Play’e uygulamamızı beta yada alpha olarak publish ettikten sonra InAppProducts’un altına

Manage Poducts tabı altında Create Managed Product’u (tek seferlik satın alma)  ve ya Subscriptions tabı altında Cretae Subscrption‘ı (haftalık,aylık,yıllık satın alma) seçiyoruz.

Açılan sayfada id ,başlık ve ücret kısımlarını istediğimiz şekilde doldurup unique bir id vermemiz gerekiyor ki bu şekilde Google Play uygulama içinde hangi ürünün satıldığını bilsin.

Product ID: Uygulama içinde hangi ürünün satın alınmaya çalışıldığını anlamak için verilen unique id (her ürün için farklı olmalı)

Title: Ürün Adı

Description: Ürün Açıklaması

Price : Ne kadar Ücret isteyeceğimiz

Billing Period : Ne kadar sürede bir satın almanın otomatik tekrarlanacağı (Subscription) (haftalık,aylık,3 aylık,6 aylık,yıllık)

Free Trial Period: Kaç gün ücretsiz deneyebileceği (Subscription)

Biz bu dersimiz için ,

3 adet tekli satın almak için ürün ve

 

 

 

 

 

1 adet haftalık periyotla satılacak ürün tanımlıyoruz.

 

In-app Billing Android Uygulama’ya Entegre Etmek

Uygulama içi satın alım için Google Play ayarlarımızı tamamladık. Yukarıdaki id’leri artık uygulamamız içinde kullanabiliriz.

Şimdi yapmamız gereken işlemleri sırasıyla anlatalım.

Projemizi oluşturup Manifest dosyasına gerekli izinleri eklememiz gerekiyor.

Manifest Ayarı

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="com.android.vending.BILLING" />

Gradle Ayarı

Daha sonra build.gradle’ın içine billing kütüphanesini eklememiz gerekiyor.

dependencies {
    ...
    compile 'com.android.billingclient:billing:1.0'
}

PurchasesUpdatedListener

Daha sonra Uygulama içi alımları yapacağımız Activity’e PurchasesUpdatedListener interface’ini  aşağıdaki gibi implement etmemiz gerekiyor.

public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {

    }
}

PurchasesUpdatedListener interface’ni implement ettiğimiz zaman onPurchasesUpdated() methodunu override etmemiz gerekiyor. Bu method bize kullanıcının satın aldığını yada iptal ettiğini söylüyor, yada başka bir sorun varsa buradan takip etmemiz gerekiyor.Biz şimdilik kullanıcının satın alıp almadığı ile ilgileniyoruz.

BillingClientStateListener

onCreate methodumuzda BillingClient sınıfından bir obje yaratarak , kendi class’ımızı parametre olarak geçiyoruz. Böylelikle onPurchasesUpdated() methodumuz BillingClient tarafından çağrılıcak ve bize gerekli bilgileri verecek. Oluşturduğumuz BillingClient objesinin startConnection() methoduna BillingClientStateListener interface’ni ekleyerek satın alma işlemini hazır olunup olunmadğı kontrolü yapılır.

Aşağıda kod üzerinde anlatmaya çalışayım.

    private BillingClient mBillingClient;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBillingClient = BillingClient.newBuilder(this).setListener(this).build(); //BillingClient objemizi oluşturduk 
        mBillingClient.startConnection(new BillingClientStateListener() { //satın almaya hazır mı kontrolü
            @Override
            public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
                if (billingResponseCode == BillingClient.BillingResponse.OK) {
                    // Satın almaya hazır
                    // BUTONLARI AKTIF ET
                    enableOrDisableButtons(true); //butonları aktif et
                } else {
                    //TODO Kullanıcıya uyarı ver
                    // Satın almaya hazır değil
                    Toast.makeText(MainActivity.this, "Ödeme sistemi için google play hesabını kontrol ediniz", Toast.LENGTH_SHORT).show();
                    enableOrDisableButtons(false);//butonları pasif et
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Servise Bağlanamadı
                //TODO Kullanıcıya uyarı ver
                enableOrDisableButtons(false);//butonları pasif et
                Toast.makeText(MainActivity.this, "Ödeme sistemi şuanda geçerli değil", Toast.LENGTH_SHORT).show();
            }
        });
    }

Eğer Billing servisi aktif ise satın alma butonlarımızı aktif hale getirebiliriz. Değil ise kullanıcıya bilgi vermemiz ve satın alma butonlarımızı deaktif etmemiz gerekiyor.

Activity Kodumuzun Tamamı

package com.pasaoglu.mobilhanem.inappbilling;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesUpdatedListener;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Optional;

public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener {

    private BillingClient mBillingClient;

    @BindView(R.id.btn_three_buy_health) 
    Button btn_three_buy_health;

    @BindView(R.id.btn_ten_buy_health)
    Button btn_ten_buy_health;

    @BindView(R.id.btn_twenty_buy_health)
    Button btn_twenty_buy_health;

    @BindView(R.id.btn_fifty_buy_health)
    Button btn_fifty_buy_health;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
                if (billingResponseCode == BillingClient.BillingResponse.OK) {
                    // The billing client is ready. You can query purchases here.
                    // BUTONLARI AKTIF ET
                    enableOrDisableButtons(true);

                } else {
                    //TODO Kullanıcıya uyarı ver
                    Toast.makeText(MainActivity.this, "Ödeme sistemi için google play hesabını kontrol ediniz", Toast.LENGTH_SHORT).show();
                    enableOrDisableButtons(false);
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
                //TODO Kullanıcıya uyarı ver
                enableOrDisableButtons(false);
                Toast.makeText(MainActivity.this, "Ödeme sistemi şuanda geçerli değil", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void enableOrDisableButtons(boolean isEnabled) {
        btn_three_buy_health.setEnabled(isEnabled);
        btn_ten_buy_health.setEnabled(isEnabled);
        btn_twenty_buy_health.setEnabled(isEnabled);
        btn_fifty_buy_health.setEnabled(isEnabled);
    }
    @Optional
    @OnClick(R.id.btn_three_buy_health)
    void buyThreeHealth(View view) {
        buyProduct("3_buy_health");//Buradaki id Google Play'de tanımlanan id
    }
    @Optional
    @OnClick(R.id.btn_ten_buy_health)
    void buyTenHealth(View view) {
        buyProduct("10_buy_health"); //Buradaki id Google Play'de tanımlanan id
    }
    @Optional
    @OnClick(R.id.btn_twenty_buy_health)
    void buyTwentyHealth(View view) {
        buyProduct("20_buy_health");//Buradaki id Google Play'de tanımlanan id
    }
    @Optional
    @OnClick(R.id.btn_fifty_buy_health)
    void buyFiftyHealth(View view) {
        buySubscription("50_buy_health");//Buradaki id Google Play'de tanımlanan id
    }

    private void buyProduct(String skuId) {
        //Bir defa satın almak için
        //Buradaki skuId , google playde tanımladığımız id'ler olmalı 
        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                .setSku(skuId)
                .setType(BillingClient.SkuType.INAPP)
                .build();
        mBillingClient.launchBillingFlow(this, flowParams);
    }

    private void buySubscription(String skuId) {
        //haftalık,aylık,3 aylık,6 aylık ,yıllık üyelik için
        //Buradaki skuId , google playde tanımladığımız id'ler olmalı
        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                .setSku(skuId)
                .setType(BillingClient.SkuType.SUBS)
                .build();
        mBillingClient.launchBillingFlow(this, flowParams);
    }

    @Override
    public void onPurchasesUpdated(int responseCode, @Nullable List purchases) { //satın alma işlemi bittikten sonra bu method otomatik çağırılır
        if (responseCode == BillingClient.BillingResponse.OK 
                && purchases != null) { //satın alma başarılı
            for (final Purchase purchase : purchases) {
                mBillingClient.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() {
                    @Override
                    public void onConsumeResponse(int responseCode, String purchaseToken) {
                        if (responseCode == BillingClient.BillingResponse.OK) {
                            //satın alma tamamlandı yapacağınız işlemler
                        }
                    }
                });
            }
        } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {//kullanıcı iptal etti
            // Handle an error caused by a user canceling the purchase flow.
            billingCanceled(); //kullanıcı iptal etti

        } else {
            billingCanceled(); //bir sorun var
        }
    }

    private void billingCanceled() {
        //Kullanıcı iptal ettiğinde yapılacak işlemler
    }

    


}

Xml itemlerini koda tanıtmak için ButterKnife kütüphanesini kullandık. İncelemek isterseniz tıklayınız.

Özet

Yukarıda gördüğünüz gibi Google Play’de eklediğimiz ürünlerin id’lerini burada kullanıyoruz. Böylelikle hangi ürünü satın alacağımızı bildirmiş oluyoruz. Ben gerekli açıklamaları kod üzerinde yapmaya çalıştım.

Ürünü nasıl daha etkili satabiliriz, satışlarımızı nasıl arttırabiliriz ve ya satışlarımızı nasıl analiz ederiz gibi konular ise farklı bir konu başlığında işlenebilinir. Biz bu dersimiz de in-app billing‘i nasıl kullanacağımızı anlatmaya çalıştık.

Kaynak kodu indirip denemenizi şiddetle tavsiye ederim.

Bu dersimde sizlere in-app billing kullanımını anlatmaya çalıştık. Benim anlatmak istediklerim bu kadar. Umarım sizler için yararlı olmuştur. Konu hakkında soru , görüş ve yorumlarını konu altından ve ya SoruCevap sitemizden sorabilirsiniz.

Sıfırdan Android derslerimiz için tıklayınız.

47

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

44 Yorum

  • Merhabalar bu işlemi adapter içerisinde gerçekleştirebiliyor muyuz?
    Ayrıca Activity üzerinden gerçekleştirdikten sonra satın alma butonuna tıkladıktan sonra bp.purchase(MainActivity.this,”satın alma idsi”);
    şeklinde kod giriyorum. ama hata kodu geliyor.

      • Evet, aynı şekilde recyclerview deki herhangi bir iteme tıkladığımda ödüllü reklam çıkmasını da sağlayamamaktayım.

        • Sitedeki adapter kullanımı hakkında bilgi içeren konuyu inceledim. Tıklama özelliğini Activity’e taşıyıp işlemleri gerçekleştirdim. Teşekkür ederim.

  • Öncelikle çok teşekkür ederim paylaşım için..ben çok yeniyim ı yüzden soru biraz saçma olabilir.ama önce uygulamayı google play e yüklemek lazım gibi bir fikir oluştu bence..uygulamayi oluşturmadan nasil yükleyemez.id değerlerini uygulamayı yüklemeden alıp sonra uygulamayı yapmaya başlayacaz sanırım..yanlis mıyım.

  • merhaba, gerçekten bilgilendirici olmuş ama merak ettiğim bir konu var.
    bir üyenin aboneliğinin devam edip etmediğini nasıl sorgulayacağız?
    yani satın alma başarılı oldu ve 1 aylık abonelik alındı. peki bunu uygulama başlangıcında nasıl kontrol edeceğiz?

    • Merhaba en iyi yöntemi bu kontrolü server tarafından yapmanız olacaktır. Fakat mobil tarafta denemek isterseniz,
      getPurchases()
      getPurchaseHistory() methodları ile satın aldığınız itemların durumunu görebilrisiniz

      • getPurchaseHistory() bu methodu kullandığım zaman responseCode -2 dönüyor nedeni ne olabilir

  • Merhabalar, şöyle bir sorum olacaktı.
    Ürün içi satınalma işlemini gerçekleştirdim. benim anladığım kadarıyla şöyle bir sistem kurabiliyoruz;

    satın alma işlemini gerçekleştirdim, işlem başarılı olduğunda bana ProductId ve Token bilgisi dönüyor. herhangi bir hack durumunu engellemek adına ben bu bilgileri server tarafına gönderip,
    GET https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/products/productId/tokens/token

    apisi ile bunun gerçek bir işlem olup olmadığını kontrol edebiliyorum. Buraya kadar doğru mu anladım?

    2. sorum ise, android.test.purchased ile kontrol işlemimi sağlamaya çalıştım fakat, ürünü 1 kez aldıktan sonra, 2. ye almak istediğimde
    Error response: 7:Item Already Owned hatası dönüyor. yapmak istediğim sistem uygulama içi kredi alma sistemi olduğu için ürün 1 den fazla kez alınabilir olmasını istiyorum. burda nasıl bir adım izlemeliyim? emeğiniz için şimdiden teşekkürler

  • Merhaba ben uygulamamın içerisinde satın alma adımlarını test etmek istiyorum.
    Ücretsiz olarak bunu nasıl deneme şansım olabilir. Daha önce deneyimlediyseniz tecrübenizden yararlanmak isterim.

    • PLay Storeye yüklemeden bunu yapmak mümkün değil ne yazık ki.. Ayrıca yayıncı kendi ürününü satın alamıyor.. Satın almalar yapabilmeniz için uygulamanızın alfa veya beta olmasına dikkat edin lütfen..

  • Merhaba güzel anlatım olmuş. Uygulama içi satın alma ile uygulamadaki admob reklamlarını kaldırmak istiyorum nasıl bi mantık izlemem gerekir. Satın alma olunca reklam kalkacak bu kısımda sorun yok. ama kullanıcı uygullamayı silip tekrar yüklediğinde neler olacak pek kavrayamadım?

    • Kullanıcıları tuttuğun bir veri tabanın varsa oraya showAd diye bir bool tanımlayabilirsin. Satın alım sonucunda bu alanı false yaparsın. Reklamları gösterdiğin fonksiyon içerisinde userModel.showAd==true ise reklamı gösterirsin. Eğer kullanıcıları bi yerde tutmuyorsan cihaz id’si kullanarak basit bir veritabanı yapabilirsin. Ben firebase realtime database ya da firestore öneririm. Silip yüklerse bile cihaz id sini kullanarak açılışta firebase’e ya da kendi backend’ine bağlanıp kontrol edersin. Offline olarak external data erişimi isteyip bi yerlere yazabilirsin ama bu seferde cihaz formatlanınca silinir. Saygılar.

      • Merhaba,
        Peki kullanıcı cihazı değiştirince bunun takibini nasıl yapacağız? Ayrıca geri ödeme yaptığımızda bunun takibini nasıl yapabiliriz? Benim uygulamamda kullanıcı tutmuyorum.Cihaz idsi tutarsam cihaz değişimi olduğunda bunu takip edemem. Aslında bu durumları google apisi ile takip edebiliyor olmamız gerekir. Fakat bu durumla ilgili realtime bir yöntem bulamadım. getPurchaseHistory() metodu geri ödenmiş, iptal olmuş, satın alınmış tüm ögeleri gösteriyor. getPurchase() ise gerçek zamanlı bir state durumu vermiyor(yada testte vermiyor onu anlayamadım.) Bu konuda bunu yapanlar nasıl yapıyor anlayabilmiş değili. Kullanıcılarım uygulamayı silip tekrar yüklediğinde (veriler temizlendiği durumda)telefon değiştirip uygulamayı yeniden yüklediğinde eğer satın almışsa reklam göstermesin istiyorum. Eğer parasını iade etmişsem tekrar reklam göstersin istiyorum ama tam stabil bir yöntem bulamadım.

    • Kullanıcı uygulamayı kaldırıp yüklediğinde reklamlar çıkar.. Fakat reklamları kaldır butonuna bastığında “satın alma menüsü” çıkmadan reklamlar kaldırılır. Hali hazırdaki reklamlar görünür ama Uygulamayı tekrar çalıştırırsa reklamlar bir daha görünmez..

  • Merhaba, anlatım için teşekkürler.

    public void onConsumeResponse(int responseCode, String purchaseToken) {
    if (responseCode == BillingClient.BillingResponse.OK) {
    //satın alma tamamlandı yapacağınız işlemler
    }
    }

    Hangi ürünün satın aldığını bu fonksiyon içerisinde nasıl anlıyoruz? Mesela 10 can mı 20 can mı satın aldı?

    • if (purchase.getSku().equals(“10_healt”)){

      toast (10 can alındı) – toast işlemini bilirsin tam yazmadım
      }

    • Gerekmiyor hocam.. Fakat vergilendirme sisteminde bireysel veya şirket gibi seçenekeler var.. oradan kendinize uygun olanı seçiyorsunuz.. Türkiyede play store kazançlarından dolayı % 18 vergi veriyoruz..

  • Selam açıklamanız için teşekkür ediyorum. Sormak istediğim birşey var. Ben uygulama içi ürün satın almaya bir ürün yerleştirdim. Bir cihazdan bu ürün satın alınıldığında. Sonra tekrar aynı cihaz satın almak istediğinde satın alma işlemi gerçekleşmiyor hata veriyor. Sorun ne olabilir yardım eder misiniz?

  • Merhaba , güzel kod için teşekkürler, gerçekten yabancı kaynaklarda dahi büyük eksiklik vardı bu konuda. Benim sorum tek kullanımlık veya subscription şeklinde googleconsole’a kaydettiğimiz satınalmaları ismen çağırdık ama ne kendi license key imizi ne de merchant id mizi kullandık görebildiğim kadarıyla.. Acaba otomatik olarak mı geldi bu kontroller halihazırda store’a yüklü bir app olduğu için? Son olarak da bu kodu kendi uygulamamızda kullanabilir miyiz izniniz varmıdır ve de sizce tam bir kodmudur yani exception, güvenlik vs bakımlarından
    Tekrar çok teşekkürler

  • Satın alma işlemini yaptığımız buton bir daha çalışmıyor ve o satın alma işlemi gerçekleşmiyor bir daha.. sanki google bunu abonelik gibi anlıyor ve bir daha o işlemi yapmıyor. Farklı bir kod mu eklememiz gerekiyor acaba..

    • Çok Özür Taha Bey.. bir de şöyle bir sıkıntı var.. satın alma işlemi yapan kişi her o butona tıkladığında satın alma menusu çıkmadığı gibi kişinin hesabına satın aldığı kadar elmas(coins) ekleniyor 🙁

  • Merhaba,
    Bu şekilde uygulama içi satın alma yöntemini bir ürün (sizin örneğinizde can) satmak için değil de uygulamada yer alan reklamları kaldırmaya yönelik nasıl yapabilirim? Admob kullanıyorum. Örneğin aylık 1 lira ödesinler ve 1 ay boyunca reklam görmesinler. Bunu aylık, yıllık paketler halinde yapacağım.

  • Ciddi anlamda güzel olmuş. Elinize sağlık. Ufak bir sorum olacak. Uygulama içi dinamik ürünlerim olsa ve kendi web servisimden ürün ekleyerek vede eş zamanlı playstore-console’a da eklesem herhangi bir politika hatası yapmış olur muyum?

  • Merhabalar, Unity için Google lisans kodu yerleştirmeyi gösteren bir konu açar mısınız? Teşekkürler..

  • Anlatım için teşekkür ederim.Butona tıklayıp Satın alım/üyelik sonrası saatığımız içeriğe yani yeni activity’e nasıl yönlendiriyoruz bu konuda yardım ederseniz memnun olurum.

  • basit bir oyun ve oyun icerisinde mobil odeme satin alma sistemi yapmak istiyorum daha dogrusu yaptirmak istiyorum yardimci olabilirsejiz sevinirkm

  • Taha bey emeğinize sağlık yukarıdaki kodları uyguladım gayet güzel çalışıyor fakat bir sorunum var satın alma öncesi pasif olan butonu satın alma sonrası aktif edecek yolu bilmiyorum yardımcı olursanız memnun olurum. Sizin android dersleri çok faydalı teşekkür ederim.

  • Sunucudan bilgi alırken hata oluştu sorunu çıkıyor. Bu kadar zor olmamalı bu iş. Derin araştırmalar sonucunda da bir şey çıkmadı hala aynı durum devam ediyor. Neden böyle eksik lik yok mu sizce de napmam lazım diğer uygulamalarda çalışırken 5 aydır uğraştığım emek verdiği uygulamama entegre ettim her şey tamam fakat sunucudan bilgi almıyor.

  • Bu normal versiyon için geçerlimi sadece beta sürüm için mi geçerli normal sürüm attığımızda satın alma gene onaylanır mı ve satın aldığımız şeyi uygulamada nasıl görücez işlettircz hesaba

  • Merhaba hocam öncelikle çok teşekkürler.Kullanıcılar satın alım yaptıktan sonra iade işlemi yaptıktan sonra uyglamadan nasıl bir kontrol yapabiliriz, iade işlemi yaptığını öğrenmek için.Herhangi bir fonksiyon varmı mevcut satın alımı gösterecek.

  • Merhaba,
    Kullanıcıya reklam kapatma satmak istiyorum. Kullanıcılarım uygulamayı silip tekrar yüklediğinde (veriler temizlendiği durumda),telefon değiştirip uygulamayı yeniden yüklediğinde satın almışsa reklam göstermesin istiyorum. Eğer parasını iade etmişsem tekrar reklam göstersin istiyorum ama tam stabil bir yöntem bulamadım. Benim uygulamamda kullanıcı tutmuyorum.Cihaz idsi tutarsam cihaz değişimi olduğunda bunu takip edemem. Aslında bu durumları google apisi ile takip edebiliyor olmamız gerekir. Fakat bu durumla ilgili realtime bir yöntem bulamadım. getPurchaseHistory() metodu geri ödenmiş, iptal olmuş, satın alınmış tüm ögeleri gösteriyor. getPurchase() ise gerçek zamanlı bir state durumu vermiyor(yada testte vermiyor onu anlayamadım.) Bu konuda bunu yapanlar nasıl yapıyor anlayabilmiş değili.

    • Aynı durumu yaşıyorum. getPurchase() aboneliği iptal etmeme rağmen bana veri döndürüyor. Siz bir sonuca ulaşabildiniz mi? Sadece test ortamına özgü bir durum mu bu?

  • Merhaba, uygulama içi satın alma için ingilizce çeşitli örnekler buldum fakat o örneklerde hep aidl dosyası yüklü. Util klasöründe ise Base64 vs. çeşitli classların oldugu örneklerle karsılastım. Bu örnekte ise o tarza class yok. Bneim kafam karıstı. Bu örnekle ile bu örnek arasında nasıl bir fark var?

  • Uygulamada kullanici abone olduktan sonra uygulamayı yeniden başlattığı zaman aboneliğin halen aktif olup olmadığını nasıl kontrol edeceğiz yardımcı olabilecek var mı çok sevinirim

    • Bu getPurchaseHistory için örnek bir kod gerekli çok acil lazım atamadığım yer kalmadı bulamadım yapmak istediğim program açıldığında abone olan kullanıcı hala abonemi değil mi onu anlayabilmek hepsi bu

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?