java - Android 应用内计费 : Start purchase flow when button is pressed

标签 java android in-app-billing

我已按照 google GitHub example 在我的 Activity 中实现了应用内结算

这是我的代码:

public class Premium extends Activity implements IabBroadcastReceiver.IabBroadcastListener {
Button premium;

//toast
Context context = getBaseContext();
int duration = Toast.LENGTH_SHORT;

//debug tag
static final String TAG = "CHORDS";

//does the user have premium?
boolean mIsPremium = false;

//SKUs
static final String SKU_PREMIUM = "chords_premium";

// (arbitrary) request code for the purchase flow
static final int RC_REQUEST = 10001;

// The helper object
IabHelper mHelper;

// Provides purchase notification while this app is running
IabBroadcastReceiver mBroadcastReceiver;


public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.premium_layout);
    premium = (Button) findViewById(R.id.premium);

    String base64EncodedPublicKey = "Key"

    // Create the helper, passing it our context and the public key to verify signatures with
    Log.d(TAG, "Creating IAB helper.");
    mHelper = new IabHelper(this, base64EncodedPublicKey);

    // Start setup. This is asynchronous and the specified listener
    // will be called once setup completes.
    Log.d(TAG, "Starting setup.");
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            Log.d(TAG, "Setup finished.");

            if (!result.isSuccess()) {
                // Oh noes, there was a problem.
                Log.d(TAG, "Problem setting up in-app billing: " + result);
                return;
            }

            // Have we been disposed of in the meantime? If so, quit.
            if (mHelper == null) return;

            mBroadcastReceiver = new IabBroadcastReceiver(Premium.this);
            IntentFilter broadcastFilter = new IntentFilter(IabBroadcastReceiver.ACTION);
            registerReceiver(mBroadcastReceiver, broadcastFilter);

            Log.d(TAG, "Setup successful. Querying inventory.");
            try {
                mHelper.queryInventoryAsync(mGotInventoryListener);
            } catch (IabHelper.IabAsyncInProgressException e) {
                Log.d(TAG, "Error querying inventory. Another async operation in progress.");
            }

        }
    });

}

// Listener that's called when we finish querying the items and subscriptions we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        Log.d(TAG, "Query inventory finished.");

        // Have we been disposed of in the meantime? If so, quit.
        if (mHelper == null) return;

        // Is it a failure?
        if (result.isFailure()) {
            Log.d(TAG, "Failed to query inventory: " + result);
            return;
        }

        Log.d(TAG, "Query inventory was successful.");

             /*
         * Check for items we own. Notice that for each purchase, we check
         * the developer payload to see if it's correct! See
         * verifyDeveloperPayload().
         */

            // Do we have the premium upgrade?
            Purchase premiumPurchase = inventory.getPurchase(SKU_PREMIUM);
            mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
            Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));


            premium.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mIsPremium = true)
                        premium.setEnabled(false);
                    else {

                    }
                }
            });
    };
};

@Override
public void receivedBroadcast() {
    // Received a broadcast notification that the inventory of items has changed
    Log.d(TAG, "Received broadcast notification. Querying inventory.");
    try {
        mHelper.queryInventoryAsync(mGotInventoryListener);
    } catch (IabHelper.IabAsyncInProgressException e) {
        Log.d(TAG, "Error querying inventory. Another async operation in progress.");
    }
}

// User clicked the "Upgrade to Premium" button.
public void onUpgradeAppButtonClicked(View arg0) {
    Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");


     /*        verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
     *        an empty string, but on a production app you should carefully generate this. */
    String payload = "";

    try {
        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, payload);
    } catch (IabHelper.IabAsyncInProgressException e) {
        Log.d(TAG,"Error launching purchase flow. Another async operation in progress.");

    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
    if (mHelper == null) return;

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

/** Verifies the developer payload of a purchase. */
boolean verifyDeveloperPayload(Purchase p) {
    String payload = p.getDeveloperPayload();
    return true;
}

// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);

        // if we were disposed of in the meantime, quit.
        if (mHelper == null) return;

        if (result.isFailure()) {
            Log.d(TAG, "Error purchasing: " + result);
            return;
        }
        if (!verifyDeveloperPayload(purchase)) {
            Log.d(TAG, "Error purchasing. Authenticity verification failed.");
            return;
        }

        Log.d(TAG, "Purchase successful.");

        if (purchase.getSku().equals(SKU_PREMIUM)) {
            // bought the premium upgrade!
            Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
            Toast toast = Toast.makeText(context, R.string.premium_bought, duration);
            toast.show();
            mIsPremium = true;
            updateUI();
        }
    }
};

// We're being destroyed. It's important to dispose of the helper here!
@Override
public void onDestroy() {
    super.onDestroy();

    // very important:
    if (mBroadcastReceiver != null) {
        unregisterReceiver(mBroadcastReceiver);
    }

    // very important:
    Log.d(TAG, "Destroying helper.");
    if (mHelper != null) {
        mHelper.disposeWhenFinished();
        mHelper = null;
    }
}

public void updateUI() {
    //TODO: elimina pubblicita
}

}

正如我在标题中所写,我需要启动 google purchase 当我的高级按钮被按下时。 android 文档对于如何做这些事情不是很清楚。

我应该在 OnClick() 方法中添加什么来启动购买流程?

最佳答案

你应该打电话

mHelper.startSetup 

单击按钮即可开始购买流程。

关于java - Android 应用内计费 : Start purchase flow when button is pressed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39407719/

相关文章:

java - 在不同的 JVM 版本下运行两个 Fuse 实例

java - 当使用 Hibernate ORM 时,我应该先建模类图还是数据库图?

android - 编舞(639): Skipped 50 frames

android - 如何使用 Android NDK 以正确的依赖顺序构建多个项目?

android - 我怎样才能在android中实现恢复购买

android - 如何判断我使用的是哪个版本的应用内结算

java - EJB 不是 "visible"给 EJB 管理器。不能使用 CDI 或 JNDI 来引用它

java - 在 PHP 脚本中包含 Java 类

android - 如何以编程方式从 Android 中的 Google 驱动器选择的文件下载并保存在本地目录中?

android - 实现 Google 应用内计费 - 哪个 Google 教程是正确的?