2

我正在做一个项目,我需要把它变成消耗品。

点击购买按钮,使用以下代码进行消费。

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

但它在 IabHelper 类中得到了“购买的空指针异常”。

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);
}
4

1 回答 1

1

看来您正在使用我今天偶然发现的 Google 的marketbilling 项目。我不知道这是否是进行应用内计费的“标准”方式,但知道您从一开始就使用它会很有帮助。

无论如何,该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,最终将其传递给consumeas itemInfo。当 consumer 执行 check!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)时,会得到空指针异常。

简而言之,将一个有效Purchase对象传递给该consumeAsync方法。

于 2013-03-22T20:56:54.243 回答