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!
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
@BlueHazard: sembra che tu debba sostituire "questo" con "Donate.this" per fare riferimento all'attività. Ho aggiunto il codice che lo dimostra. – ianhanniballake
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