不绑定来自IabHelper的应用内结算服务

时间:2017-03-04 03:48:39

标签: android in-app-billing

我想在我的应用中添加应用内购买,但我无法将我的活动绑定到应用内结算服务。

我已经完成了页面https://developer.android.com/training/in-app-billing/preparing-iab-app.html

中提到的所有步骤

在物理设备中调试我发现问题出现在IabHelper类的下一个命令中:

mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

我注意到它无法正常工作,因为程序不会停止在ServiceConnection实例的两个方法中的任何一个,也就是说,它不会停在onServiceConnected()或onServiceDisconnected()

我直接在我的Activity中使用相同的命令进行了测试,并且与应用内结算服务的绑定成功。

因此,如果从Activity请求绑定,则绑定正在工作,但是当从IabHelper类请求绑定时它不起作用。

我的问题是,如何将我的活动从IabHelper类绑定到结算服务?

以下是从IabHelper调用startSetup方法的代码:

mHelper = new IabHelper(this, publicKey);

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener()
{
    @Override
    public void onIabSetupFinished(IabResult result)
    {
        if(!result.isSuccess())
        {
            mHelper=null;
            return;
        }

        if (mHelper == null) return;
    }
});

这是IabHelper类中用于绑定服务的代码:

Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
List<ResolveInfo> intentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0);
if (intentServices != null && !intentServices.isEmpty())
{
    // service available to handle that Intent
    mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}

以下是我用来直接从活动绑定到服务的代码:

private IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection()
{
    @Override
    public void onServiceDisconnected(ComponentName name)
    {
        mService = null;
    }

    @Override
    public void onServiceConnected(ComponentName name,IBinder service)
    {
        mService = IInAppBillingService.Stub.asInterface(service);
    }
};

Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
this.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我只是意识到自己的错误,我在startSetup完成之前调用了queryInventoryAsync方法。

这是我的错误:

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener()
{
    @Override
    public void onIabSetupFinished(IabResult result)
    {
        if(!result.isSuccess())
        {
            mHelper=null;
            return;
        }
    }
});

try {mHlpr.queryInventoryAsync(true, itemList, mQueryListener);}
catch (IabHelper.IabAsyncInProgressException e) {e.printStackTrace();}

要更正,我将代码更改为:

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener()
{
    @Override
    public void onIabSetupFinished(IabResult result)
    {
        if(!result.isSuccess())
        {
            mHelper=null;
            return;
        }
        else if(result.isSuccess())
        {
            try {mHlpr.queryInventoryAsync(true, itemList, mQueryListener);}
            catch (IabHelper.IabAsyncInProgressException e) {e.printStackTrace();}
        }
    }
});

当我直接从活动中测试绑定时,我已经删除了查询命令,这就是它从活动中工作的原因;当我从IabHelper类测试时,我正在调用查询命令