2012-12-16 29 views
7

Để kiểm tra trong thanh toán ứng dụng v3 cho Android, tôi đã triển khai hộp thoại thêm bộ điều hợp mục lựa chọn duy nhất. Tôi đã thêm Skus thử nghiệm, "android.test.purchased", "android.test.canceled", "android.test.refunded", "android.test.item_unavailable".Trong thanh toán ứng dụng v3 NullPointerException

Khi tôi sử dụng hộp thoại để khởi chạy quy trình mua hàng, mọi thứ đều ổn, tôi có thể mua mặt hàng và mặt hàng được mua chắc chắn nhất. Tuy nhiên, tôi nhận được một nullpointerexception khi ứng dụng của tôi sau đó cố gắng làm mới giao diện người dùng. Tôi biết công việc làm mới.

Dưới đây là logcat của tôi:

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 là một ArrayList mà giữ 4 dòng sản phẩm trên.

Con trỏ trống là SkuDetails c = inv.getSkuDetails (s);

Trả về null khi làm mới giao diện người dùng. Nhưng vấn đề là nó dường như làm việc cho sku đầu tiên (android.test.purchased) nhưng là null cho sku thứ hai (android.test.canceled) và nó cũng chỉ là null khi nó chạy sau khi đã mua một mục khác (hoàn lại tiền hoặc mua). Tuy nhiên, nếu sau đó tôi mở nó lại, nó ổn và không có nullpointerexception được ném.

Nếu tôi thêm một kiểm tra null trước khi thêm vào các đối tượng ArrayList, sau đó có mặt hàng được thêm vào như tất cả các mục sau hoặc trước mục mua đang quay trở lại null trên inv.getSkuDetails (s)

+0

Nó thực sự rất đơn giản mà là tuyệt vời cho một người mới như bản thân mình. Đầu tiên (giả sử bạn sử dụng nhật thực) chỉ nơi bạn tải xuống SDK, hãy xem trong phần tính năng bổ sung cho thanh toán trong ứng dụng. Một khi bạn làm điều đó, nếu bạn điều hướng đến thư mục android-sdk của bạn, nó có dưới extras> google> trong thanh toán ứng dụng v3 -> mẫu. Tất cả những gì bạn phải làm là nhập và sao chép các tệp util và thêm một số truy vấn và người nghe như được mô tả tại đây http://developer.android.com/training/in-app-billing/preparing-iab-app.html#GetSample – AndroidPenguin

+0

Xin chào AndroidPenguin, Cảm ơn bạn đã trợ giúp. Hầu như được triển khai, chỉ có một sự nhầm lẫn hoặc có thể nói không hiểu từ liên kết của google rằng làm thế nào để khôi phục lại giao dịch. Nếu mỗi sản phẩm không thể được mua lại một lần nữa thì làm thế nào để có được thông tin rằng tôi đã mua sản phẩm. cảm ơn .. :) – LuminiousAndroid

+1

Niềm vui của tôi! Đừng quên upvote. Việc mua truy vấn xảy ra ngay sau khi thiết lập thực hiện điều này. Miễn là bạn không tiêu thụ mua hàng của bạn tất nhiên. – AndroidPenguin

Trả lời

4

đặn nó ra, để lại điều này cho bất kỳ ai có cùng vấn đề với tôi. Trong giao diện người dùng làm mới, tôi đã gọi truy vấn IabHelper mà không truy vấn chi tiết của skus. Vì vậy, skus precached đã có chi tiết, nhưng những người không, thất bại.

+0

Bạn có thể giải thích? –

5

Điều này khiến tôi bối rối và câu trả lời được chấp nhận không chứa các chi tiết cần thiết.

Những gì bạn cần làm là chuyển Danh sách có SKU bạn muốn truy vấn (cho dù chúng được mua hay không) sau khi gọi startSetup. Vì vậy, nó sẽ trông giống như mã dưới đây thay vì những gì được cung cấp trong ví dụ mẫu TrivialDrive (không đầy đủ).

mHelper.queryInventoryAsync(true, skuList, mGotInventoryListener); 

Ngoài ra, có vẻ như có một số phương pháp ma (mà vẫn chưa dọn dẹp trong các ý kiến, mà cũng không chính xác) ... biết thêm chi tiết về lỗi ở đây:

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

+0

Đây phải là câu trả lời được chấp nhận.Điểm chính là để vượt qua trong skuList để có được các chi tiết sku mà bạn tìm kiếm. Nếu bạn không vượt qua trong skuList, phương thức gọi lại sẽ chỉ trả lại cho bạn chi tiết sku của sản phẩm đã mua! – Bruce

Các vấn đề liên quan