1

我正在嘗試使用IabHelper實施inApp結算服務。我設法在沒有問題的情況下完成整個購買流程。Android InApp賬單:如何檢測後臺中斷購買過程?

//----------------------------------------------- 
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); 

}  

然而,當用戶啓動購買我無法檢測到該事件,但再按谷歌確認屏幕按鈕「買」來打斷它的退格。

它既不會在onIabPurchaseFinished上觸發失敗,也不會觸發onActivityResult,因此我的應用程序停留在中間狀態。

請幫我解決我的問題。

+0

請在下面檢查我的答案。 – Maulik

回答

1

據我明白你的問題,你是在應用結算中搜索購買取消事件。

您可以通過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) { 

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

      } 
} 

您也可以手動使用你的業務邏輯處理。檢查是否 用戶取消購買產品,然後把標誌用戶購買或 如果不是,則再次調用launchPurchaseFlow()方法。

編輯

onDestroy() method 

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

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

,如果你有按鈕,然後就可以直接調用launchPurchaseFlow()方法 到onClick事件讓每一個你mHelper創建爲 新的購買時間。

如果你是在onCreate方法使用它,你沒有任何按鈕 點擊事件來購買產品,那麼你必須按照我的知識給一個空值 。

希望它能解決您的問題。

+0

它工作,感謝一個!!!,現在當我從這個事件回來,我的購買流程停留在一個未完成的狀態,如果用戶想要做另一個購買我有一個異常「無法啓動異步操作(launchPurchaseFlow),因爲另一個asyn操作(launchPurchaseFlow)正在進行中。「當事件取消被觸發時,您是否知道如何銷燬之前的purchaseFlow? – user1778857

+0

你應該問另一個問題,或者你可以upvote我的答案:P。請檢查我上面編輯的答案。 – Maulik

+0

我不是在摧毀活動(這個我知道)時討論破壞mHelper。我想只是在檢測到取消結果後取消購買流程,以便如果用戶想再次嘗試(假設他錯誤地按退格鍵,然後想再次啓動購買),mHelper可以與其他購買交易重複使用。在目前情況下,應用程序將崩潰,因爲之前的purchaseFlow仍然存在(即使用戶已取消它)。 – user1778857

0

,你可以用這種方法檢測背襯首要

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
//do what you want to avoid going back while during transaction 
Log.d("bak button pressed", "ture"); 
} 
return super.onKeyDown(keyCode, event); 
} 

即使檢查了這一點,它可以幫助你

Check if back key was pressed in android?

+1

嗨,感謝您的答案,但它不是問題。您無法覆蓋onKeyDown,因爲您位於Google結算活動中。 – user1778857

2

當用戶按下BACK或在對話框外按壓時,購買流程仍在進行中,如果用戶再次按下PURCHASE按鈕,將會出現異常「由於另一個異步操作正在進行而無法啓動異步操作」。

爲了解決這個問題,我手動創建了一個標誌來知道是否有正在購買的流程。而且,由於IABHelper不提供一種方式來處理採購流程,我有處置mHelper和回憶initBilling()

boolean onPurchaseFlow = false; 
public void purchaseItem() { 
     if (!onPurchaseFlow) { 
      mHelper.launchPurchaseFlow(mActivity, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener, ""); 
      onPurchaseFlow = true; 
     } else { 
    //dispose mHelper  
    if (mHelper != null) { 
      mHelper.dispose(); 
      mHelper = null; 
      } 

      initBilling(mActivity); // restart IABHelper, a code snippet will fire launchPurchaseFlow when onPurchaseFlow is true 
     } 
     } 

另一個重要部分是調用launchPurchaseFlow在onQueryInventoryFinished(),以確保它被稱爲(在用戶的第二請求)當所有的初始化操作完成:

public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
     // YOUR CODE HERE 
     if (onPurchaseFlow == true) { 
     mHelper.launchPurchaseFlow(mActivity, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener, ""); 
     } 
    } 

記住重置標誌onPurchaseFlow =假時完成的onIabPurchaseFinished()

public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
      Log.d(TAG, "Purchase successful."); 

      if (purchase.getSku().equals(SKU_PREMIUM)) { 
      // bought the premium upgrade! 
      // YOUR CODE HERE 
      onPurchaseFlow = false; 
     } 
} 
0

在IabHelper裏面有一個叫做handleActivityResult(...)的方法。

如果您重寫onActivityResult(Fragment或Activity)並在裏面調用該方法(使用相同的參數調用它)。通過這種方式,幫手管理所有的回調,並且可以重做購買流程而不會引發任何異常。

2

您可以訪問通過IabResult類的結果代碼,並將其與IabHelper類不同的結果代碼進行比較,並在OnIabPurchaseFinishedListener使用它:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
     = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
    {    

     if (result.isFailure()) { 

      if (result.getResponse() == IabHelper.BILLING_RESPONSE_RESULT_USER_CANCELED || result.getResponse() == IabHelper.IABHELPER_USER_CANCELLED){ 

       // user cancelled purchase 

      } else { 

      // any oder reasult 

      } 
      return; 
     } 

     else if (purchase.getSku().equals(SKU_SPIRIT_LEVEL)) { 

      // no error, purchase succeeded     

     } 
    } 
}; 
+0

在一些購買錯誤的情況下,android系統(IabHelper)發送與用戶取消相同的結果代碼。 –