2012-08-24 17 views
5

Merhaba, bu uygulamayı inApp Faturalandırma ile piyasaya sunduk ve günlüklerimiz, BillingService'nin (muhtemelen uygulamanın kendisi) belirli müşterilerin cihazlarına çok rastgele şekilde öldürüldüğünü gösteriyor. Bu nedenle bazen satın alma işleminin başarılı olup olmadığı bildirimini alamıyorum. Bazı müşteriler genellikle başarılı bir satın alım yapmak için iki kez satın almak zorundadır. Bu, müşterilerin küçük bir yüzdesinde olmasına rağmen, çok rahatsız edici. Bunun neden olabileceği veya bu soruna geçici bir çözüm bulmak için neler yapabileceği hakkında bir fikriniz var.Uygulama Faturalama hizmetinin zamanla öldürülmesi

+1

Süreç içinde nerede öldürülüyor? Tipik olarak Android Market yayın bildiriminden yola çıkılır -> FaturaÖdeme Saatiniz onReceived() -> BillingReceiver, BillingService için satın alma niyetini gönderir -> Faturalandırma Hizmeti, satın alınan bilgileri ele alır ve günceller. –

+0

Bu şey oldukça rasgele ve ben henüz cihazımda bu sorunu tekrarlamak için değilim. Kullanıcıların küçük bir yüzdesi olur, ancak yine de düzeltmek isterim. – the100rabh

+0

Rasgelelik onu daha da zorlaştırıyor :) Uygulamaya daha fazla izleme bilgisi ekleyebiliyor musunuz? Acra, yararlı bulduğum bir hata izleme aracıdır. Ayrıca, agresif Görev Killer uygulamaları da olabilir. –

cevap

0

Uygulama içi faturalandırmanızda kullandığınız kodu koyabilir misiniz? Uygulamaya göre faturalandırma, cihazlarının desteklemediği ya da Android Market yayın bildirimine erişmeye çalışırken İnternet bağlantısının kesilmesi durumunda bile olabilir. Ne benim app kullanılan böyle temelde: Sonra

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
if(BillingHelper.isBillingSupported()){ 
     switch (arg2) { 
     case 0:   
      Log.d("Appname", "30 coins"); 
      BillingHelper.requestPurchase(context, "com.paid.smallcoinbundle"); 
       break; 
     case 1: 
      Log.d("Appname", "85 coins"); 
      BillingHelper.requestPurchase(context, "com.paid.medcoinbundle"); 
       break; 
     case 2: 
      Log.d("Appname", "175 coins"); 
      BillingHelper.requestPurchase(context, "com.paid.midcoinbundle"); 
       break; 
     case 3: 
      Log.d("Appname", "500 coins"); 
      BillingHelper.requestPurchase(context, "com.paid.maxcoinbundle"); 
       break; 
     default: Log.d("Appname", "Something broke"); 
     break; 
     } 
    // BillingHelper.requestPurchase(mContext, "android.test.purchased"); 
     // android.test.purchased or android.test.canceled or android.test.refunded or com.blundell.item.passport 
    } else { 
     LayoutInflater inflater = getLayoutInflater(); 
     View layout = inflater.inflate(R.layout.toast_layout,(ViewGroup) findViewById(R.id.toast_layout_root)); 
     TextView text = (TextView) layout.findViewById(R.id.text); 
     text.setText("In App Billing isnt supported by your device"); 
     Toast toast = new Toast(getBaseContext()); 
     toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
     toast.setDuration(Toast.LENGTH_LONG); 
     toast.setView(layout); 
     toast.show(); 
     return; 
    } 
} 

:

public Handler mTransactionHandler = new Handler(){ 
    public void handleMessage(android.os.Message msg) { 
     Log.d("Appname", "Transaction complete"); 
     Log.d("Appname", "Transaction status: "+BillingHelper.latestPurchase.purchaseState); 
     Log.d("Appname", "Item purchased is: "+BillingHelper.latestPurchase.productId); 

     if(BillingHelper.latestPurchase.isPurchased()){ 
      Log.d("Appname", "Ispurchased : " + BillingHelper.latestPurchase.productId); 
      if(BillingHelper.latestPurchase.productId.equals("com.paid.smallcoinbundle")){ 
       ConnectToServer.UpdateCoins(context,id,"add","30"); 
      } 
      if(BillingHelper.latestPurchase.productId.equals("com.paid.medcoinbundle")){ 
       ConnectToServer.UpdateCoins(context,id,"add","85"); 
      } 
      if(BillingHelper.latestPurchase.productId.equals("com..paid.midcoinbundle")){ 
       ConnectToServer.UpdateCoins(context,id,"add","175"); 
      } 
      if(BillingHelper.latestPurchase.productId.equals("com.paid.maxcoinbundle")){ 
       ConnectToServer.UpdateCoins(context,id,"add","500"); 
      } 

      finish(); 
     } 
    }; 

};

Uygulama faturalandırmasında işe yaradığını söylemiş olduğunuzdan, bazen öğeyi iki kez satın almaları gerekmesine rağmen, paket adlarınızın doğru olduğunu varsayalım.

Lütfen düzeltmeyi ve sorunu ne zaman çözdüğünüzü bildirin. Bu çok ilginç bir konu.

+0

Bu gerçekten ilginçtir, kod doğrudan Google örnek kodundan alınmıştır. Çoğu kullanıcı için mükemmel çalışır. Bir avuç bu sorunu yaşar. – the100rabh

+0

Bu durumda muhtemelen sistemde bir hata olacaktır. Dev ekibine bir hata raporu yaz. Üzgünüm, sana yardım edemedim. –

+0

Merhaba Randy, Bana yardım etmeye çalıştığınız için teşekkürler :) – the100rabh

2

Ben yardımcı olacaktır emin değilim, ama senin BillingService ön plan hizmetini yapmak öneriyoruz: http://developer.android.com/guide/components/services.html#Foreground İşte

sistemi dikkate alan bir ön plan halde, hizmet koymak için dokümantasyon "API parçasıdır Kullanıcının aktif olarak farkında olduğu ve bu nedenle bellekte düşük olduğunda öldürme adayı olmayacağı bir şey olması için. "

Kullanıcınızın küçük bir yüzdesi düşük bellek durumuna sahip olabilir ve bununla birlikte hizmetlerinizi/uygulamalarınızı öldürmeye başlayabilirsiniz.).

+0

Evet, düşük bellek hakkında doğru. Bu benim de tahminimce. Fakat bunu bir ön plan süreci yapmak gerçekten iyi bir öneridir. Bu yardımcı olabilir. Ama gerçek şu ki tüm süreç sadece hizmet değil, yeniden başlıyor gibi görünüyor. – the100rabh

+0

O anda önalan aktiviteleriniz (veya servisleriniz) yoksa, sistem düşük bellek koşullarında tüm süreci (büyük olasılıkla) kesebilir. –