2012-12-16 90 views
7

要在Android應用程序結算v3中進行測試,我實現了一個對話框,其中添加了一個選項適配器。我已經添加了測試Skus,「android.test.purchased」,「android.test.canceled」,「android.test.refunded」,「android.test.item_unavailable」。在應用程序結算v3 NullPointerException

當我使用對話框啓動採購流程時,一切都很好,我可以購買該物品並確定購買該物品。但是,當我的應用程序嘗試刷新UI時,我得到一個nullpointerexception。我知道刷新工作。

這裏是我的logcat:

12-16 01:06:06.706: I/Running inventory query with(20846): android.test.purchased 
12-16 01:06:06.706: I/Running details query with(20846): SkuDetails:{"title":"Sample Title","price":"£0.61","type":"inapp","description":"Sample description for product: android.test.purchased.","productId":"android.test.purchased"} 
12-16 01:06:06.706: I/Running details query with(20846): SkuDetails:{"title":"Sample Title","price":"£0.61","type":"inapp","description":"Sample description for product: android.test.purchased.","productId":"android.test.purchased"} 
12-16 01:06:06.706: I/Running inventory query with(20846): android.test.canceled 
12-16 01:06:06.706: I/Running details query with(20846): null 
12-16 01:06:06.706: I/Running details query with(20846): null 
12-16 01:06:06.706: D/AndroidRuntime(20846): Shutting down VM 
12-16 01:06:06.706: W/dalvikvm(20846): threadid=1: thread exiting with uncaught exception (group=0x40d12930) 
12-16 01:06:06.706: E/AndroidRuntime(20846): FATAL EXCEPTION: main 
12-16 01:06:06.706: E/AndroidRuntime(20846): java.lang.NullPointerException 
12-16 01:06:06.706: E/AndroidRuntime(20846): at com.example.test.MainActivity$1.onQueryInventoryFinished(MainActivity.java:201) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at com.example.test.util.IabHelper$2$1.run(IabHelper.java:536) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at android.os.Handler.handleCallback(Handler.java:725) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at android.os.Looper.loop(Looper.java:137) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at java.lang.reflect.Method.invoke(Method.java:511) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-16 01:06:06.706: E/AndroidRuntime(20846): at dalvik.system.NativeStart.main(Native Method) 

for (String s : allSkus) { 
Log.i("Running inventory query with", "" + s); 
SkuDetails c = inv.getSkuDetails(s); 
Log.i("Running details query with", "" + c); 
if (inv.hasPurchase(s)) { 
    purchaseArray.add(c.getTitle()); 
} else { 
    **LINE 201** objects.add(c.getPrice() + " T:" + c.getSku()); 
} 

allSkus是持有上述4個單品的ArrayList。

空指針是 SkuDetails c = inv.getSkuDetails(s);

它在UI刷新上返回null。但問題是它似乎適用於第一個sku(android.test.purchased),但對於第二個sku(android.test.canceled)爲null,並且它也僅在購買另一個項目(退還或購買)。但是,如果我隨後再次打開它,那就沒有問題,並且不會拋出nullpointerexception。

如果我加入到ArrayList對象,那麼沒有項目被添加爲每一個項目後,或購買項目之前前添加一個空檢查在inv.getSkuDetails(S)返回null

+0

對於像我這樣的新手來說,這其實很簡單。首先(假設你使用eclipse)就在你下載SDK的地方,查看應用程序結算的附加內容。一旦你這樣做了,如果你導航到你的android-sdk文件夾,它就在應用程序結算v3 - >示例中,在extras> google>下。你所要做的就是導入它並複製實用程序文件並添加一些查詢和監聽器,如http://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample – AndroidPenguin

+0

嗨AndroidPenguin, 感謝您的幫助。幾乎實施,只是有一個單一的困惑,或可以說從谷歌的鏈接不知道如何恢復交易。如果每件產品都不能再次購買,那麼如何獲得我已經購買該產品的信息。 謝謝.. :) – LuminiousAndroid

+1

我的榮幸!不要忘記註冊。在設置後立即進行的查詢購買完成此操作。只要你不消費你的購買當然。 – AndroidPenguin

回答

4

想通了,留下這對任何與我有同樣問題的人來說都是如此。在UI刷新中,我調用IabHelper查詢而不查詢skus的詳細信息。因此,預先得到的skus有詳細信息,但那些沒有的,失敗了。

+0

你能解釋一下嗎? –

5

這讓我難住,接受的答案沒有包含相關的細節。

你需要做的是在調用startSetup之後,將一個List與要查詢的SKU(不管它們是否被購買)進行傳遞。所以它看起來像下面的代碼,而不是TrivialDrive樣板(不足)中提供的內容。

mHelper.queryInventoryAsync(true, skuList, mGotInventoryListener); 

此外,它看起來像有一些幻象的方法(即仍尚未清理的意見,這也是不準確的)......該錯誤的詳細信息,在這裏:

http://code.google.com/p/marketbilling/issues/detail?id=98

+0

這應該是被接受的答案。重點是傳入skuList以獲取您尋求的sku細節。如果您未通過skuList,則回調方法將僅返回您購買產品的sku詳細信息! – Bruce