5

Google が提供するガイドを使用して寄付の InApp 購入を設定しようとしましたが、アクティビティを呼び出すと (成功したかどうかにかかわらず返されるはずです)、次のエラーがスローされます。

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

アクティビティは、次のメソッドで呼び出されます。

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

Donate クラス (このガイドでコーディングしてみました) は次のようになります。

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

}

まだ共有設定がない場合は、共有設定に保存される開発ペイロードを生成することになっています。追加情報が必要な場合は、お気軽にお問い合わせください。

ご協力いただきありがとうございます!

4

2 に答える 2

5

onIabSetupFinishedListener呼び出す前に、戻るのを待つ必要がありlaunchPurchaseFlowます。これらの行をonIabSetupFinishedListeneronIabSetupFinishedメソッドに移動して、IabHelperのセットアップが完了していることを確認します。

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);
            }
        }
    });
于 2013-05-05T18:54:19.797 に答える