2

私は消耗品にする必要のあるプロジェクトに取り組んでいます。

購入ボタンをクリックすると、以下のコードを使用して消費します。

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

しかし、ここIabHelperクラスでPurchaseの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);
        }

誰かがこれに関するアイデアを持っているかどうか私に知らせてください。

ConsumerAsync()のコード

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、最終的にはとしてに渡しconsumeますitemInfo。消費がチェック!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)を実行すると、nullポインタ例外が発生します。

つまり、有効なPurchaseオブジェクトをconsumeAsyncメソッドに渡します。

于 2013-03-22T20:56:54.243 に答える