2012-08-24 7 views
5

Witam wypuściliśmy tę aplikację na rynku z płatności inApp, a nasze dzienniki pokazują, że BillingService (prawdopodobnie sama aplikacja) utrzymuje zabicia bardzo losowo na niektórych urządzeniach klientów. Z tego powodu czasami nie mogę uzyskać powiadomienia, jeśli zakup się powiódł. Niektórzy klienci często muszą kupić dwa razy, aby dokonać udanego zakupu. Choć zdarza się to niewielkiemu odsetkowi klientów, ale jest to bardzo kłopotliwe. Każdy pomysł, dlaczego tak się dzieje i co można zrobić, aby obejść ten problem.W usłudze rozliczeń App zabił się czasem

+1

Gdzie w trakcie procesu zostaje zabity? Zwykle pochodzi z powiadomienia o transmisji w usłudze Android Market -> Twoje konto rozliczeniowe onReceived() -> BillingReceiver wysyła zakupione zamiary do BillingService -> BillingService obsługuje i aktualizuje zakupione informacje. –

+0

Chodzi o to, że jest całkiem przypadkowa, a ja mam jeszcze raz wydać ten numer na moim urządzeniu. Zdarza się to niewielkiemu odsetkowi użytkowników, ale i tak chciałbym to naprawić. – the100rabh

+0

Losowość czyni to znacznie trudniejszym :) Czy jesteś w stanie dodać więcej informacji o śledzeniu w aplikacji? Acra to narzędzie do śledzenia błędów, które uważam za przydatne. Może to być również agresywne aplikacje Task Killer. –

Odpowiedz

0

Czy możesz podać kod użyty do rozliczania aplikacji? Może się tak zdarzyć, że w przypadku płatności za aplikacje nie są obsługiwane przez ich urządzenia, a nawet jeśli utracą połączenie internetowe podczas próby uzyskania dostępu do powiadomienia o transmisji w usłudze Android Market. Co użyłem w mojej aplikacji jest w zasadzie tak:

@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; 
    } 
} 

Następnie:

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(); 
     } 
    }; 

};

Ponieważ powiedziałeś, że w rozliczeniu aplikacji działa, chociaż czasami trzeba kupić przedmiot dwa razy, zakładam, że twoje nazwy paczek są prawidłowe.

Proszę dać mi znać, jeśli chodzi o naprawianie i problem. To bardzo interesujący temat.

+0

To naprawdę interesujące, kod jest w pewnym sensie wybrany bezpośrednio z kodu przykładowego Google. Działa doskonale dla większości użytkowników. Garstka z nich doświadcza tego problemu. – the100rabh

+0

W takim przypadku prawdopodobnie byłby to błąd w systemie. Napisz raport o błędach do zespołu Dev. Przepraszam, że nie mogłem ci pomóc. –

+0

Cześć Randy, Dzięki za próbę pomocy :) – the100rabh

2

Nie jestem pewien, czy to pomoże, ale polecam, aby Państwa BillingService usługę pierwszoplanowy: http://developer.android.com/guide/components/services.html#Foreground

Oto kawałek dokumentacji „API umieścić usługę w stanie planie, gdzie system uzna jest to coś, o czym użytkownik jest aktywnie świadomy, a zatem nie jest kandydatem do zabijania, gdy brakuje pamięci. "

Może to oznaczać, że mały procent użytkownika ma niski poziom pamięci i zaczynają zabijać usługi/aplikacje (w tym twój).

+0

Tak, ur prawo o niskiej pamięci. To też moje przypuszczenie, ale. Ale uczynienie go procesem pierwszoplanowym jest rzeczywiście dobrą propozycją. To może pomóc. Ale faktem jest, że cały proces wydaje się ponownie uruchomić, a nie tylko usługę. – the100rabh

+0

W przypadku, gdy nie masz żadnych działań na pierwszym planie (lub usług) w tym momencie, system może (i najprawdopodobniej) zabije cały proces w stanie niskiej ilości pamięci. –

Powiązane problemy