为了测试Android应用内计费v3,我实现了一个对话框,其中添加了一个选项适配器。我添加了测试SKU,“Android.测试.购买”,“Android.测试.取消”,“Android.测试.退款”,“Android.测试.项目不可用”。
当我使用该对话框启动购买流时,一切正常,我能够购买该商品,并且该商品是绝对购买的。然而,当我的应用程序尝试刷新UI时,我会收到一个nullpointerexception。我知道刷新工作。
这是我的日志:
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是一个ArrayList,其中包含上述4个SKU。
空指针为SkuDetails c=inv.getSkuDetails;
在UI刷新时返回null。但问题是,它似乎对第一个sku(android.test.purchased)有效,但对第二个sku(android.test.cancelled)无效,而且只有在购买了另一件商品(退款或购买)后运行时才为空。但是,如果我随后再次打开它,就可以了,不会抛出nullpointerexception。
如果我在添加到ArrayList对象之前添加一个空检查,那么没有项目被添加,因为在购买的项目之后或之前的每个项目都在Sku细节inv.get返回空
把这个留给和我有同样问题的人。在UI刷新中,我调用IabHelper查询,而没有查询SKU的详细信息。因此,预先准备好的SKU有细节,但那些没有细节的SKU失败了。
这让我感到困惑,被接受的答案没有包含相关的细节。
您需要做的是在调用starSetup后向您要查询的SKU传递一个列表(无论它们是否被购买)。因此,它看起来像下面的代码,而不是(不充分的)样板TrivialDrive示例中提供的代码。
mHelper.queryInventoryAsync(true, skuList, mGotInventoryListener);
此外,似乎还有一些虚幻的方法(这些方法在评论中还没有被清除,它们也不准确)。。。有关该漏洞的更多详细信息,请点击此处:
http://code.google.com/p/marketbilling/issues/detail?id=98
启动购买流后,onActivityResult方法需要什么? 来自平凡的驱动器示例: msgstr"在这里,您可以对与应用内计费无关的活动结果执行任何处理" 这是否意味着您需要更新用户的清单或显示警报框?如果是这样,我已经在OnConsumeFinishedListener中这样做了。我已经测试了我的代码,留下了上面的onActivityResult方法,看起来没问题。这可能会导致任何问题吗? 或
我正在尝试实现销售消耗品(硬币)的谷歌应用内计费。我用一个非消耗品测试了它,它工作正常。但是我不能让它成为消耗品。每次我测试它,我只能买一次!这是我的代码: 公共类MainActivity扩展了AppCompatActivity{IabHelper mHelper; ### 对不起我的英语,谢谢。
我意识到每次应用程序运行时都没有必要检查谷歌play商店,尤其是如果购买已经准备好了。如果用户在使用应用程序时没有GPRS/WiFi,这也可能会导致问题! 因此,我在考虑创建一个共享偏好,它将作为检查用户是否购买了应用内购买的条件。 还有其他更安全的方法吗?正如我所读到的,共享首选项可以很容易地改变。
我在测试我的应用内计费时遇到了麻烦。 (使用Google Play应用内计费版本3 API) 问题: 已退款的应用程序内购买仍然存在于购买列表中,该列表由BillingClient.query购买()提供。 当我在一月份尝试退款时,退款的物品从购物清单上消失了。 我所做的: 作为测试人员购买了一些物品。 (我很确定对话框说是测试购买。) 之后在谷歌游戏控制台退款。 等到他们的付款状态变成退款。 清
我一直在徒劳地想弄明白这一点。为我的Android应用程序设置应用内账单需要什么。尤其是,整个谷歌钱包商户账户让我感到困惑。 因此,如果我做对了,以下是步骤: 创建Google开发者账户 在与Developer相同的帐户上创建Google钱包商户帐户 上传你的. apk到开发者控制台 添加您希望销售的产品 在你的应用程序中编程这些东西 上传new. apk到控制台,添加测试帐户。 测试应用的应用内
我在Android应用程序中实现了应用内计费,有6款产品,它们就像用户为了在我的应用中购买物品而购买的硬币。应用程序内的设置和测试非常完美,我阅读了所有谷歌文档,并按照他们说的做了,但我的问题是,我的产品显示在一个我称为,但物品总是被消费或拥有。以下是我的代码: 任何帮助都将不胜感激。 类: 以下是我对多重消费所做的。 但在结果中,我不知道如何根据位置处理所有项目的结果是否成功。我应该为它运行fo