2013-05-05 9 views
5

Ho provato a configurare gli acquisti InApp per una donazione con lo guide provided by Google ma quando chiamo l'attività (che dovrebbe tornare se fosse un il successo o meno), ma getta questo errore:Errore di fatturazione in-app Android: stato illegale per operazione (launchPurchaseFlow): l'helper IAB non è impostato

In-app billing error: Illegal state for operation (launchPurchaseFlow): IAB helper is not set up 

l'attività viene chiamato con questo metodo:

public boolean donation() { 
     int success = 0; 
     Intent intent = new Intent(Main.this, Donate.class); 
     startActivityForResult(intent, success); 
     if (success != 0) { 
      return true; 
     } 
     else return false; 
    } 

e la classe Donare (che ho provato la codifica con la guida) si presenta così:

import java.math.BigInteger; 
import java.security.SecureRandom; 
import maturaarbeit.nicola_pfister.marks.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.util.Log; 

public class Donate extends Activity { 

    IabHelper mHelper; 

    private static final String TAG = "Donate"; 
    private String payload; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String base64EncodedPublicKey = getKey(); 
     mHelper = new IabHelper(this, base64EncodedPublicKey); 

     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 

      @Override 
      public void onIabSetupFinished(IabResult result) { 
       if (!result.isSuccess()) { 
        Log.d(TAG, "Problem setting up In-app Billing: " + result); 
       } 
      } 
     }); 

     SharedPreferences prefs = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE); //Add shared preferences 
     payload = prefs.getString("devpayload", null); 
     if (payload == null) { 
      payload = getPayload(); 

      Editor editor = prefs.edit(); 
      editor.putString("devpayload", payload) 
      .apply(); 
     } 
     mHelper.launchPurchaseFlow(this, "donation_1chf", 1, mPurchaseFinishedListener, payload); 
     finish(); 
    } 

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 

     @Override 
     public void onIabPurchaseFinished(IabResult result, Purchase info) { 
      if (result.isFailure()) { 
       Log.d(TAG, "Error purchasing: " +result); 
       return; 
      } 
      else if (info.getDeveloperPayload().equals(payload)) { 
       return; 
      } 
     } 
    }; 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.i(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); 
     if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      super.onActivityResult(requestCode, resultCode, data); 
     } else { 
      Log.i(TAG, "onActivityResult handled by IABUtil."); 
     } 
    } 

    private String getKey() { 
     //Code for building public key 
    } 

    private String getPayload() { 
     SecureRandom random = new SecureRandom(); 
     { 
     return new BigInteger(130, random).toString(32); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     if (mHelper != null) mHelper.dispose(); 
     mHelper = null; 
     super.onDestroy(); 
    } 

}

Si suppone per generare un carico utile dev che è memorizzato in prefs condivise, se non ce n'è già uno. Se hai bisogno di ulteriori informazioni non esitare a chiedere.

Grazie per il vostro aiuto!

risposta

5

bisogna aspettare per onIabSetupFinishedListener di tornare prima di chiamare launchPurchaseFlow - spostare tali linee nei vostri onIabSetupFinishedListener 's onIabSetupFinished metodo per assicurare che il IabHelper' setup s è completa:

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     @Override 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       Log.d(TAG, "Problem setting up In-app Billing: " + result); 
      } 
      else { // Only launch the purchase flow if setup succeeded 
       mHelper.launchPurchaseFlow(Donate.this, "donation_1chf", 1, 
        mPurchaseFinishedListener, payload); 
      } 
     } 
    }); 
+0

Se provo a mettere il launchPurchaseFlow in onIabSetupFinished ottengo questo errore: Il metodo launchPurchaseFlow (Attività, String, int, IabHelper.OnIabPurchaseFinishedListener) nel tipo IabHelper non è applicabile per gli argomenti (nuova IabHelper.OnIabSetupFinishedListener() { }, String, int, IabHelper.OnIabPurchaseFinishedListener) – BlueHazard

+1

@BlueHazard: sembra che tu debba sostituire "questo" con "Donate.this" per fare riferimento all'attività. Ho aggiunto il codice che lo dimostra. – ianhanniballake

+0

Avevi ragione. L'ho fatto esattamente come te, ma non avevo cambiato il contesto. La prossima volta che vedrò un "questo" contesto proverò questo prima. – BlueHazard

1

si dovrebbe usare vero e proprio dispositivo per la fatturazione delle app perché quando si utilizza l'emulatore alcuni parametri sono nulli e causano errori di runtime.

Problemi correlati