要在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
對於像我這樣的新手來說,這其實很簡單。首先(假設你使用eclipse)就在你下載SDK的地方,查看應用程序結算的附加內容。一旦你這樣做了,如果你導航到你的android-sdk文件夾,它就在應用程序結算v3 - >示例中,在extras> google>下。你所要做的就是導入它並複製實用程序文件並添加一些查詢和監聽器,如http://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample – AndroidPenguin
嗨AndroidPenguin, 感謝您的幫助。幾乎實施,只是有一個單一的困惑,或可以說從谷歌的鏈接不知道如何恢復交易。如果每件產品都不能再次購買,那麼如何獲得我已經購買該產品的信息。 謝謝.. :) – LuminiousAndroid
我的榮幸!不要忘記註冊。在設置後立即進行的查詢購買完成此操作。只要你不消費你的購買當然。 – AndroidPenguin