7

Mam następujące metody (które działa prawidłowo po raz pierwszy):NullPointer na startIntentSenderForResult, inappbilling V3

public void TipUs(){ 
    String sku="tip_us"; 

    try { 
    Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), 
                sku, "inapp", "TIP_US"); 
    PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); 
    startIntentSenderForResult(pendingIntent.getIntentSender(), 
           1001, new Intent(), 
           Integer.valueOf(0), Integer.valueOf(0), 
           Integer.valueOf(0)); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } catch (SendIntentException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1001) 
     {  
      int responseCode = data.getIntExtra("RESPONSE_CODE", 0); 
      String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); 
      String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); 

      if (resultCode == RESULT_OK) { 
       try { 
        JSONObject jo = new JSONObject(purchaseData); 
        String sku = jo.getString("productId"); 
       } 
       catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
} 

Gdyby spróbować ponownie użyć tej samej metody (co powinno być możliwe w zależności od ustawień w Google Play) Pojawia się następujący błąd:

java.lang.NullPointerException 
at com.appiclife.tipcal.Tip_Calculator.TipUs(Tip_Calculator.java:521) 
at com.appiclife.tipcal.Tip_Calculator.onClick(Tip_Calculator.java:350) 
at android.view.View.performClick(View.java:2485) 
at android.view.View$PerformClick.run(View.java:9080) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
at dalvik.system.NativeStart.main(Native Method) 

Czy ktoś ma błąd, ponieważ użyłem dokładnie wersji demonstracyjnej od Google, co powinienem zmienić?

EDYTOWANIE: Wygląda na to, że mService ma wartość null (choć dziwne jest to, że działało na raz, więc wygląda prawie jak problem, jeśli kupujesz więcej niż raz ten sam przedmiot). Mam następujący:

To jest mój kod:

OnCreate() 

Intent("com.android.vending.billing.InAppBillingService.BIND"), 
        mServiceConn, Context.BIND_AUTO_CREATE); 

I:

IInAppBillingService mService; 

ServiceConnection mServiceConn = new ServiceConnection() { 

    public void onServiceConnected(ComponentName name, 
       IBinder service) { 

       System.out.println("Test!"); 
       mService = IInAppBillingService.Stub.asInterface(service); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     mService = null; 
    } 


}; 

onServiceConnected nigdy nie jest wywoływana. Nie widzę tego w instrukcji: http://developer.android.com/google/play/billing/billing_integrate.html

ale starałem się dodać następujące usługi manifest, bez rezultatu (usunąłem go ponownie, należy Oświadczam usługę tam?):

<service android:name="com.android.vending.billing.IInAppBillingService" /> 
+0

'na com.appiclife.tipcal.Tip_Calculator.TipUs (Tip_Calculator.java:521)' Czym jest linia 521? – Sam

+0

Hey Sam, \t startIntentSenderForResult (pendingIntent.getIntentSender(), – Diego

+0

Nigdy nie używałem w aplikacjach rozliczeniowych, ale przypuszczam, że transakcja się nie powiodła (powinieneś sprawdzić kod odpowiedzi) – Sam

Odpowiedz

4

Wpadłem na ten sam problem. Konieczne jest ZUŻYCIE zakupionego przedmiotu, zanim użytkownik będzie mógł ponownie kupić ten sam artykuł SKU.

Po ustawieniu zmiennej buyIntentBundle można sprawdzić RESPONSE_CODE. Jeśli RESPONSE_CODE ma wartość 7, to poprzedni zakup musi zostać zużyty przez aplikację.

RESPONSE_CODE identyfikatory można znaleźć tutaj: http://developer.android.com/google/play/billing/billing_reference.html#billing-codes

zapytań dla zakupionych przedmiotów wykorzystujących ten przykładowy kod: http://developer.android.com/google/play/billing/billing_integrate.html#QueryPurchases

W danych INAPP_PURCHASE_DATA_LIST jest ciągiem JSON z "purchaseToken". Przekaż ten token do funkcji CONSUME.

Po ZUŻYCIE zakupu użytkownik może go kupić ponownie.

+0

Dziękuję bardzo ! Bardzo wartościowa odpowiedź! – Matteo