【问题标题】:How to setup In App purchase (Non Consumable)?如何设置应用内购买(非消耗品)?
【发布时间】:2019-09-21 14:05:08
【问题描述】:

我正在使用一些在线教程在我的应用中实现应用内购买。但本教程适用于 Consumable In App Purchase。但就我而言,用户只需要购买一次。

我修改了代码,在购买应用内购买后禁用“购买按钮”。现在它工作正常。但问题是,如果我关闭并打开应用程序,“购买按钮”就会启用。

这是我的 xml 代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".InAppBillingActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/click_string"
        android:id="@+id/clickButton"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="113dp"
        android:onClick="buttonClicked"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/buy_string"
        android:id="@+id/buyButton"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:onClick="buyClick" />
</RelativeLayout>

这是我的应用内结算活动

public class InAppBillingActivity extends AppCompatActivity {

    private static final String TAG =
            "InAppBilling";
    IabHelper mHelper;
    static final String ITEM_SKU = "com.example.buttonclick";

    private Button clickButton;
    private Button buyButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_in_app_billing);

        buyButton = (Button)findViewById(R.id.buyButton);
        clickButton = (Button)findViewById(R.id.clickButton);
        clickButton.setEnabled(false);
        String base64EncodedPublicKey =
                "<place your public key here>";

        mHelper = new IabHelper(this, base64EncodedPublicKey);

        mHelper.startSetup(new
                                   IabHelper.OnIabSetupFinishedListener() {
                                       public void onIabSetupFinished(IabResult result) {
                                           if (!result.isSuccess()) {
                                               Log.d(TAG, "In-app Billing setup failed: " +
                                                       result);
                                           } else {
                                               Log.d(TAG, "In-app Billing is set up OK");
                                           }
                                       }
                                   });
    }

    public void buttonClicked (View view)
    {
        Intent Quiz = new Intent(getApplicationContext(), QuestionYearwises.class);
        startActivity(Quiz);
    }

    public void buyClick(View view) {
        mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,
                mPurchaseFinishedListener, "mypurchasetoken");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent data)
    {
        if (!mHelper.handleActivityResult(requestCode,
                resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                consumeItem();
                buyButton.setEnabled(false);
            }

        }
    };
    public void consumeItem() {
        mHelper.queryInventoryAsync(mReceivedInventoryListener);
    }

    IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
            = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result,
                                             Inventory inventory) {

            if (result.isFailure()) {
                // Handle failure
            } else {
                mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                        mConsumeFinishedListener);
            }
        }
    };

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
            new IabHelper.OnConsumeFinishedListener() {
                public void onConsumeFinished(Purchase purchase,
                                              IabResult result) {

                    if (result.isSuccess()) {
                        clickButton.setEnabled(true);
                    } else {
                        // handle error
                    }
                }
            };

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


}

【问题讨论】:

  • 谁能分享这个答案。如何使用共享偏好来保存按钮状态。

标签: android in-app-billing android-inapp-purchase


【解决方案1】:

每次您的用户打开应用时,您要做的第一件事就是检查购买状态。如果用户已经拥有该购买,请在您的应用中发布与购买相关的功能,然后只需将您的按钮可见性设置为View.GONE 或对您有意义的东西,我个人只是将其隐藏。

如果是一次性购买,则不得消费您的购买,在您的 mPurchaseFinishedListener 中您似乎正在消费它,然后当您在用户打开应用程序时检查该项目的所有权时,它似乎是一个递归购买,因为您已经消费了该物品,它将允许您再次购买。

您可能要考虑使用Google Play Billing Library,如果您使用的是带有AIDL 的那个,它将被弃用see

这是一个Codelab,让您开始使用Google Play 结算库

【讨论】:

  • 我看到了示例教程,但它也包含订阅和消耗品。我对编码很陌生,所以我无法从中受益。如果可能的话,你能编辑我的代码并在这里发布吗?
  • 对编码非常陌生,是通过我在答案中分享的 codelab 的一个很好的理由。如果您打算做更多的 Android 应用程序并使用 In App Billing 了解 Play Billing Library 的工作原理是您可以开始做的最好的事情。所有one time 购买都是消耗品,最终你也会想要订阅。我无法编辑您的代码。如果此答案解决了您的问题或对您有所帮助,请考虑支持/接受。
  • 我会试试的
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多