2013-03-22 84 views
2

我正在製作一個項目,我需要製作消耗品。如何製作Android產品消耗品

點擊購買按鈕,使用下面的代碼進行消費。

inventory=new Inventory(); 
mHelper.consumeAsync(inventory.getPurchase(SKU_SUCCESS),mConsumeFinishedListener1); 

但是它在'IabHelper類中獲取'Null指針異常。

void consume(Purchase itemInfo) throws IabException { 
    checkSetupDone("consume"); 

    if (!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)) { 
     throw new IabException(IABHELPER_INVALID_CONSUMPTION, 
       "Items of type '" + itemInfo.mItemType 
         + "' can't be consumed."); 
    } 

    try { 
     String token = itemInfo.getToken(); 
     String sku = itemInfo.getSku(); 
     if (token == null || token.equals("")) { 
      logError("Can't consume " + sku + ". No token."); 
      throw new IabException(IABHELPER_MISSING_TOKEN, 
        "PurchaseInfo is missing token for sku: " + sku + " " 
          + itemInfo); 
     } 

請讓我知道是否有人有關於此的想法。

爲consumeAsync代碼()

public void consumeAsync(Purchase purchase, OnConsumeFinishedListener listener) { 
    checkSetupDone("consume"); 
    List<Purchase> purchases = new ArrayList<Purchase>(); 
    purchases.add(purchase); 
    consumeAsyncInternal(purchases, listener, null); 
} 

public void consumeAsync(List<Purchase> purchases, OnConsumeMultiFinishedListener listener) { 
    checkSetupDone("consume"); 
    consumeAsyncInternal(purchases, null, listener); 
} 
+1

您可以提供consumeAsync()方法和異常堆棧跟蹤的代碼嗎? – Taoufix 2013-03-22 09:15:33

+0

下面是consumeAsyc代碼, 公共無效consumeAsync(購購, \t \t \t OnConsumeFinishedListener聽者){ \t \t checkSetupDone( 「消耗」); \t \t列表購買=新ArrayList (); \t \t purchases.add(purchase); \t \t consumeAsyncInternal(purchases,listener,null); \t} ************ 公共無效consumeAsync(列表購買, \t \t \t OnConsumeMultiFinishedListener聽者){ \t \t checkSetupDone( 「消耗」); \t \t consumeAsyncInternal(purchases,null,listener); \t} – 2013-03-22 09:23:54

+0

'consumeAsyncInternal'的代碼是否被重載?如果沒有,爲什麼你在'consumeAsyncInternal(purchases,listener,null);'中調用它;'在另一個情況下調用它'consumeAsyncInternal(purchases,null,listener);''參數的倒置似乎是尋找空指針異常的顯而易見的地方。 – jerry 2013-03-22 13:54:27

回答

1

看來你使用谷歌的marketbilling project,這是我今天對面跌跌撞撞。我不知道這是否是執行應用內結算的「標準」方式,但從一開始就知道您正在使用此功能會很有幫助。

無論如何,Inventory類也是該項目的一部分。當您執行以下操作時,您正在創建一個空的Inventory對象inventory=new Inventory();。這並不奇怪,那麼,inventory.getPurchase(SKU_SUCCESS)將返回null:

/** Returns purchase information for a given product, or null if there is no purchase. */ 
public Purchase getPurchase(String sku) { 
    return mPurchaseMap.get(sku); 
} 

你是路過該值mHelper.consumeAsync,最終通過它來consumeitemInfo。當消耗執行檢查!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)時,您會收到空指針異常。

總之,將有效的Purchase對象傳遞給consumeAsync方法。

+0

是的,傑裏你是對的,其實我沒有在主要活動中添加消費功能。現在我添加了: mHelper.queryInventoryAsync(mGotInventoryListener); Ihelper安裝後。現在工作正常。 – 2013-03-23 06:33:54

+0

@u_pendra我很高興你能工作。如果您發現它有幫助,請接受答案,而且stackoverflow最適合反饋。請參閱[「我如何在這裏提問?」 faq條目](http://stackoverflow.com/faq#howtoask)瞭解更多細節。 – jerry 2013-03-25 20:53:51