应用内计费(v3)- IllegalArgumentException:服务未注册:

46

我刚刚发布了一个具有应用内计费功能的应用程序。到目前为止,谷歌播放商店还没有收到崩溃报告(只有当用户费心报告崩溃时才会发生这种情况),但我通过Flurry接收到了一些崩溃报告(这是自动的)。以下是崩溃报告:

class java.lang.RuntimeException
Msg: android.app.ActivityThread.performDestroyActivity:3655 (Unable to destroy activity {com.mycompany.mygame/com.mycompany.mygame.Splashscreen}: java.lang.IllegalArgumentException: Service not registered: com.mycompany.mygame.util.IabHelper$1@46369b38)

我的应用只有不到1%的执行会出现这种情况。

如果我错了,请纠正我,但我看起来在flurry报告中没有给出崩溃的行号 :-(

我甚至都不确定这个崩溃报告意味着什么,更不用说如何修复它了。有任何想法吗?


我也遇到了同样的问题。虽然不是什么大问题,但确实有点烦人。我在github上找到了一个类似的问题:https://github.com/ianhanniballake/ContractionTimer/commit/b3643e8fd1d59a508fe6764398cb22de671c4cea 你认为这可能是相同的问题吗? - gian1200
这个崩溃现在经常发生的原因是因为只有在InApp计费助手没有正确设置时才能重现。这只会发生在装有非常旧版本Google Play应用程序或根本没有Google Play应用程序(Kindle Fire)的设备上。 - GaRRaPeTa
@GaRRaPeTa 绝对正确。刚在真机上加载了API 16,结果一进入第一个界面就崩溃了 :) - IcyFlame
1个回答

117

我认为这是IabHelper.java中的一个错误。

在IabHelper dispose方法中,以下行:

            if (mContext != null) mContext.unbindService(mServiceConn);

应该改成这样。

            if (mContext != null && mService != null) mContext.unbindService(mServiceConn);

只有在服务注册后才会设置mService,因此检查它是否!= null将确保我们在尝试取消绑定之前已经成功注册了服务。


19
整个IabHelper极其有Bug,应该重新实现。 - tmanthey
4
有没有其他可供查看的非有bug的替代代码? - Mick
我最近也遇到了非常相似的崩溃,但代码看起来和你写的一样。这怎么可能呢? - android developer
@androiddeveloper 不确定,但如果你最近修复了一个带有错误的旧apk,那么它很可能仍然会导致这个问题。 - therealsachin
@therealsachin 不,这不是最近发生的事情,我甚至都不记得是我做的还是代码本来就是那样的。奇怪的是,这只发生在一个用户身上,或者只有他觉得有必要报告,但这很不可能,因为我已经有很多用户了。我添加了一个try-catch语句,似乎“修复”了问题,但我不认为这是一个好的解决办法。 - android developer
这可能有点晚了,但在这里有一个回答,介绍如何不使用IabHelper和可怕的Trivial Drive库实现IAB v3。Android文档真的很模糊,没有很好的解释,所以我也尝试过IabHelper,但它是一个巨大的错误发射器。无论你尝试做什么,都会在某个地方崩溃或出错。 - Zoe stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接