在App Billing v3中使用IabHelper的IllegalArgumentException

时间:2013-04-25 18:26:06

标签: android in-app-billing

我已经在应用账单v3中实现了我的应用程序大约一周了。我使用了很多android的示例代码来简化集成。我经常记录崩溃,我似乎无法重现:

Exception Type: java.lang.RuntimeException
Reason: Unable to destroy activity    {[package].billing.BillingActivity}: java.lang.IllegalArgumentException: Service not registered: [package].billing.util.IabHelper$1@40646a70

这一行似乎正在打破:

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

我在我的onCreate方法中绑定了这个服务,并将它放在我的onDestroy方法中(这是记录此错误的地方)。有什么指针吗?

4 个答案:

答案 0 :(得分:34)

你可以替换你提到的那一行:

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

通过这一行

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

这应该可以解决问题

答案 1 :(得分:16)

我查看了sample project的最新版本,到目前为止,我的建议是使用IabHelper。它有很大的缺陷。

给你一个想法:

1。)IabHelper的异步方法启动一个新线程。如果在线程运行时调用IabHelper.dispose(),您将始终获得您甚至无法处理的各种异常。

2。)如果与结算服务的连接中断,则会将其设置为null。但除此之外,他们从不在访问方法之前检查mService是否为null。因此,在这种情况下,它始终会与NullPointerException一起崩溃。

public void onServiceDisconnected(ComponentName name) {
                logDebug("Billing service disconnected.");
                mService = null;

这只是冰山的一角。说真的,我不明白有人可以将它作为参考代码发布。

答案 2 :(得分:6)

我刚刚在android模拟器上遇到了同样的问题。结算v3要求Google Play应用至少应启动一次,因为模拟器缺少Google Play应用,因此无法设置帮助,也无法将其置于onDestroy()中。

我的个人解决方法是在try / catch中跳过该错误:

@Override
protected void onDestroy() {
    super.onDestroy();

    if (bHelper != null){
        try {
            bHelper.dispose();
        }catch (IllegalArgumentException ex){
            ex.printStackTrace();
        }finally{}
    }
    bHelper = null;
}

在你配置助手的每个onDestroy()中添加它。对我来说很好。

答案 3 :(得分:0)

IabHelper课程正常工作。

您需要做的是: 当您为帮助者调用startSetup时,您需要传递一个回调IabHelper.OnIabSetupFinishedListener,它将告诉您开始设置的结果。如果您在回调中失败,则未建立与Google Play服务的服务连接。 您应该根据IabHelper中收到的结果处理将来对IabHelper.OnIabSetupFinishedListener的来电。您肯定可以保留boolean字段以了解状态。

提供的答案sam实际上是一种技巧(用他自己的话来说)。辅助类不应该抛出异常,以便这些类的用户可以在这种情况下实现某些任务。

当然,try/catch是最好的方法,如果你不想详细说明(每当因异常而中断时,首先要记住的是将其放在{{1}中阻止)。