我正在尝试为我的应用实施应用内结算功能.
我正在关注谷歌的TriviaDrive示例应用程序中使用的实现,以及开发人员网站上的相关文档.
我的代码按预期工作,但当我尝试"查询可供购买的项目"时,生成的Inventory对象包含0个对象,即使我已经创建了一个产品.
我paid_version
使用Google Play开发者控制台创建了一个带有ID的托管产品,如下图所示:
文档指出"要检索产品详细信息,请调用queryInventoryAsync(boolean, List, QueryInventoryFinishedListener)
IabHelper实例."
在我自己的代码中,我调用
mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener)
where:
mHelper
我的IabHelper实例
iabItemSkus
是一个包含单个项目的List,值为"paid_version"
mQueryFinishedListener
是我在下面定义的监听器.
IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { if (result.isFailure()) { Log.d(TAG, "Querying Inventory Failed: " + result); return; } Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle()); Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription()); Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice()); } };
但是在调试时我可以看到该Inventory
对象在QueryInventoryFinishedListener
包含0项中传回,因此调用会inv.getSkuDetails(SKU_PAID).getTitle()
给出一个空指针异常.
我无法解决我出错的地方.我期待该Inventory
对象包含我paid_version
的应用内商品的详细信息.
下面只是我的代码部分和我认为与此问题相关的LogCat(试图避免给你代码重载!),但是如果代码的其他部分的更多细节会有所帮助,请告诉我.
从我的活动:
... private static final String SKU_PAID = "paid_version"; private static final String TAG = "MyActivity"; private IabHelper mHelper; ... IabHelper.QueryInventoryFinishedListener mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { if (result.isFailure()) { Log.d(TAG, "Querying Inventory Failed: " + result); return; } Log.d(TAG, "Title: " + inv.getSkuDetails(SKU_PAID).getTitle()); // <-- Line 266 of MyActivity.java Log.d(TAG, "Description: " + inv.getSkuDetails(SKU_PAID).getDescription()); Log.d(TAG, "Price = " + inv.getSkuDetails(SKU_PAID).getPrice()); } }; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... final ListiabItemSkus = new ArrayList (); iabItemSkus.add(SKU_PAID); // In App Billing String base64EncodedPublicKey = "... My Public Key ..."; mHelper = new IabHelper(this, base64EncodedPublicKey); mHelper.enableDebugLogging(true); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { Log.d(TAG, "Problem setting up In-app Billing: " + result); } // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // IAB is fully set up. Now, let's get list of available items Log.d(TAG, "Setup successful. Querying inventory."); mHelper.queryInventoryAsync(true, iabItemSkus, mQueryFinishedListener); } }); ... }
来自我的LogCat:
... 05-13 19:46:59.609 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? Starting in-app billing setup. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? Billing service connected. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? Checking for in-app billing 3 support. 05-13 19:46:59.629 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? In-app billing version 3 supported for xxx.xxxxxx.xxxxxx 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? Subscriptions AVAILABLE. 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/MyActivity? Setup successful. Querying inventory. 05-13 19:46:59.639 22390-22390/xxx.xxxxxx.xxxxxx D/IabHelper? Starting async operation: refresh inventory 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Querying owned items, item type: inapp 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Package name: xxx.xxxxxx.xxxxxx 05-13 19:46:59.649 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Calling getPurchases with continuation token: null 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Owned items response: 0 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Continuation token: null 05-13 19:46:59.659 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Querying SKU details. 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Querying owned items, item type: subs 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Package name: xxx.xxxxxx.xxxxxx 05-13 19:46:59.689 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Calling getPurchases with continuation token: null 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Owned items response: 0 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Continuation token: null 05-13 19:46:59.699 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Querying SKU details. 05-13 19:46:59.829 22390-22596/xxx.xxxxxx.xxxxxx D/IabHelper? Ending async operation: refresh inventory 05-13 19:46:59.829 22390-22390/xxx.xxxxxx.xxxxxx D/AndroidRuntime? Shutting down VM 05-13 19:46:59.829 22390-22390/xxx.xxxxxx.xxxxxx W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0x41b31ba8) 05-13 19:46:59.839 22390-22390/xxx.xxxxxx.xxxxxx E/AndroidRuntime? FATAL EXCEPTION: main Process: xxx.xxxxxx.xxxxxx, PID: 22390 java.lang.NullPointerException at xxx.xxxxxx.xxxxxx.MyActivity$1.onQueryInventoryFinished(MyActivity.java:266) at xxx.xxxxxx.xxxxxx.util.IabHelper$2$1.run(IabHelper.java:630) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) ...
PS:我刚刚更新了我的代码以突出显示第266行.
额外
我在上传APK后12小时遇到此问题,正如您从LogCat中看到的那样,它表示"In-app billing version 3 supported"
我的应用.
无论我是否将IN-APP PRODUCT的状态设置为活动或非活动状态,问题仍然存在.
现在24小时后,它神奇地决定正常工作.
由此我只能确定这是Google Play的问题,而不是我的代码.