Android InApp Billing:如何检测中断购买过程的后按?

use*_*857 2 android billing in-app-purchase in-app-billing android-billing

我正在尝试使用 IabHelper 实现应用内计费服务。我成功地完成了整个购买过程。

//-----------------------------------------------
public void billingServiceLaunchPurchase(String item) {
//-----------------------------------------------
    if (isNetworkAvailableSync(getBaseContext())) {
        currBuyItem=item;
        billingConsummeType=1;
        mHelper.launchPurchaseFlow(BaseActivity.this, item, 10001, mPurchaseFinishedListener, "");
    }
    else {
        onBillingServiceFailed();  
    }
}

    //-----------------------------------------------
    mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    //-----------------------------------------------
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
        {
           if (result.isFailure()) {
              // Handle error
              onBillingServiceFailed();                
              return;
         }      
         else if (purchase.getSku().equals(currBuyItem)) {
             billingServiceConsumeItem();
         }

        }
    }; 

@Override
//-----------------------------------------------------------------------    
protected void onActivityResult(int requestCode, int resultCode, Intent data)
//-----------------------------------------------------------------------
{
    if (billingServiceConnected) {
          if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {     
              super.onActivityResult(requestCode, resultCode, data);
          }
          else {
              // onActivityResult handled by IABUtil.
          }
    }
    else
           super.onActivityResult(requestCode, resultCode, data);

}    
Run Code Online (Sandbox Code Playgroud)

但是,当用户启动购买,然后按 Google 确认屏幕上的退格键和“购买”按钮来中断它时,我无法检测到该事件。

它既不会触发 onIabPurchaseFinished 失败,也不会触发 onActivityResult,因此我的应用程序保持中间状态。

请帮助我解决我的问题。

Mau*_*lik 5

根据我对您问题的理解,您正在应用程序计费中搜索购买取消事件。

您可以通过 onActivityResult() 方法触发此操作。将以下代码放入 onActivityResult() 方法中。有一个简单的 RESEULT_CANCEL 类型,表明您的用户已取消购买。

    if (mHelper == null)
                return;

            if (requestCode == 10001) {

                int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
                String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
                Log.d("INAPP_PURCHASE_DATA", ">>>" + purchaseData);
                String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
                Log.d("INAPP_DATA_SIGNATURE", ">>>" + dataSignature);
                String continuationToken = data
                        .getStringExtra("INAPP_CONTINUATION_TOKEN");
                Log.d("INAPP_CONTINUATION_TOKEN", ">>>" + continuationToken);

                if (resultCode == RESULT_OK) {
                    try {
                        Log.d("purchaseData", ">>>"+purchaseData);
                        JSONObject jo = new JSONObject(purchaseData);
                        String sku = jo.getString("productId");
                        alert("You have bought the " + sku
                                + ". Excellent choice, adventurer!");
                    } catch (JSONException e) {
                        alert("Failed to parse purchase data.");
                        e.printStackTrace();
                    }
                } else if (resultCode == RESULT_CANCELED) {

                    Toast.makeText(AppMainTest.this,
                            "Sorry, you have canceled purchase Subscription.",
                            Toast.LENGTH_SHORT).show();

                } else if (resultCode == IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED) {
                    Toast.makeText(AppMainTest.this, "Item already owned",
                            Toast.LENGTH_SHORT).show();
                }

            }
}
Run Code Online (Sandbox Code Playgroud)

或者

您也可以使用业务逻辑手动处理。检查用户是否取消购买产品,然后标记用户是否已购买,如果没有,则再次调用 launchPurchaseFlow() 方法。

编辑

onDestroy() method 

@Override
    public void onDestroy() {
        super.onDestroy();

        // very important:
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null)
            mHelper.dispose();
        mHelper = null;
    }
Run Code Online (Sandbox Code Playgroud)

如果您有按钮,那么您可以直接在 onClick 事件中调用 launchPurchaseFlow() 方法,以便每次您的 mHelper 创建为新购买。

或者

如果您在 onCreate 方法中使用它并且没有任何按钮单击事件来购买产品,那么据我所知,您必须将值设置为 null。

希望它能解决您的问题。