Android应用内购买挂起应用

时间:2015-08-03 12:59:05

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

我有一个Android应用程序,可以从Fragment中的对话框启动购买流程。

购买流程如下:

config.getIabHelper().launchPurchaseFlow(
          faActivity, 
          sku, 
          Constantes.SOLICITUD_COMPRA,
          faActivity.mPurchaseFinishedListener, 
          purchaseIdentifier);

其中:

  • config.getIabHelper()返回在google文档中实现的IabHelper类的实例(与trivialgame示例中使用的相同)
  • faActivity是片段的父活动
  • Constantes.SOLICITUD_COMPRA是正整数
  • mPurchaseFinishedListener是侦听器,在父活动中实现。

所以当前的流程应该像:

  1. 进行购买。
  2. 承认购买已被购买。
  3. 更新用户界面,以便用户可以使用购买的商品而不是购买商品。
  4. 然而它的工作原理如下:

    1. 进行购买。
    2. 应用程序冻结并停止。
    3. 重新启动应用程序时,将查询库存并更新UI。
    4. 似乎永远不会调用mPurchasedListener。

      为了使它变得更奇怪,一切似乎都可以正常使用测试响应。我正在测试带有真实响应的alpha应用程序,这就是出现问题的地方。

      有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在自己面前遇到过这个问题,有很多事情可能导致这个问题。

首先,请确保您已完成以下aplha阶段测试,并且已添加了所有必需的权限和aidl文件。

1)您使用的是通过Android studio在设备上放置的应用版本吗?如果是这样,这可能是你的问题。通常,您会收到一条消息,通知您正在使用的应用版本与应用内购买不兼容。 Alpha舞台应用程序实际上是从谷歌游戏商店下载的。您应该设置一个谷歌群组,该群组可以访问特定链接,允许您打开Goog​​le Play商店并下载您的Alpha舞台应用。

2)您是否已连接到互联网?显然,使用真实SKU 启动购买流程需要与Google Play服务器建立互联网连接。

3)您是否已将此产品设置为托管产品?为简单起见,我强烈建议您这样做。

如果您按照我上面提到的那样正确设置了所有内容并且仍然存在问题,则可能是您设置和尝试使用购买流程的问题。

以下是我从片段中启动购买流程的步骤

  • 不是在片段中设置IAB Helper,而是在faActivity Class中进行设置。然后,我们将通过对话框从您正在查看的片段内调用faActivity类中的购买流程方法。

这就是我在应用购买中设置的方式:

<强> faActivity.java

IabHelper mHelper;

在oncreate方法中:

 String base64EncodedPublicKey = "your in app purchase key";

    mHelper = new IabHelper(this, base64EncodedPublicKey);

    mHelper.startSetup(new
                               IabHelper.OnIabSetupFinishedListener() {
                                   public void onIabSetupFinished(IabResult result)
                                   {}});

同时添加以下方法:

 @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()) {
            return;
        }
        else if (purchase.getSku().equals(ITEM_SKU)) {
            consumeItem();
        }
    }
};


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) {
            /*The purchase was successfully consumed, now update the 

 //ui/award the user with their purchase (I suggest storing the fact that 

 they're premium or whatever within the shared prefrences of your app)*/

                }};

  String ITEM_SKU = "";
 //Launching the purchase Flow
public void makeThePurchase() {
 //Assign the SKU Name of your managed product
    ITEM_SKU="premiumMembership";
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10000,
            mPurchaseFinishedListener, "mypurchasetoken");
}

现在在您的片段中,使用此代码显示一个dialogBox,询问用户是否希望购买产品并启动购买流程,如果他们愿意这样做

 AlertDialog.Builder builder = new      AlertDialog.Builder(getActivity());
                    LayoutInflater inflater =   getActivity().getLayoutInflater();
                    builder.setView(inflater.inflate(R.layout.dialog_signin, null))
                            .setPositiveButton("Purchase", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int id) {
                                    ((faActivity)getActivity()).makeThePurchase();
                                }
                            })
                            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.dismiss();
                                }
                            });
                    builder.setTitle("Purchase");
                    builder.setMessage("Purchase premium membership?");
                    builder.create().show();

这就是我如何设法从片段中启动购买流程。我确信有更好的方法,但是当从片段中设置购买流程时,我总是在尝试启动购买时收到问题。

希望这解决了你的问题!

祝你好运! :)

注意:我上面列出的代码设置为消费购买(意味着他们拥有它的事实在查询库存时不会显示)就像我上面说的那样,如果你不关心用户必须在购买新设备或卸载应用程序时重新购买他们的商品/高级购买,然后通过在onConsumePurchasedFinished监听器中调用以下代码来跟踪他们在共享首选项中购买和使用的内容:

 SharedPreferences pref =      getActivity().getApplicationContext().getSharedPreferences("MyPref", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = pref.edit();
                    editor.putBoolean("hasBoughtPremium",true);
                    editor.apply();

然后在重新加载应用时,检查他们是否拥有高级项目:

 SharedPreferences pref =   getActivity().getApplicationContext().getSharedPreferences("MyPref",   Context.MODE_PRIVATE);
 Boolean isPremium = pref.getBoolean("hasBoughtPremium",false);