在基于Dungeons的计费服务中,bindService返回NullPointerException

时间:2012-04-24 17:05:05

标签: android service nullpointerexception billing

我正在实施基于Dungeons示例的结算服务(这是Google建议你去做的方式)。以下事实略显复杂:

  1. 主服务类存在于一个库项目中(因为我想多次重新编写代码)。由于this stackoverflow answer表明库项目中的服务可能会导致问题,因此我将服务提取为摘要并在子项目中继承它;这也让我为每个reskin使用不同的公钥(这是可取的)。
  2. 有很多UI元素需要知道是否尽快支持结算。
  3. 因此,我调用一个函数来检查第一个活动运行的onCreate()方法是否支持计费(实际上是任何活动,但是会写入首选项,因此这应该只发生一次)。

    在Dungeons示例中,检查是否支持结算的代码会尝试绑定到结算服务(来自Service类):

    boolean bindResult = bindService(
        new Intent(Consts.MARKET_BILLING_SERVICE_ACTION),
        this,  // ServiceConnection.
        Context.BIND_AUTO_CREATE);
    

    此次通话正在抛出NullPointerException。我仔细检查过,这些东西都没有;它在函数中发生,显然是在ContextWrapper.java的第370行。

    由于this other stackoverflow answer我想知道从onCreate()检查结算是否为时尚早,但是Dungeons示例项目再次从此处调用它,所以我认为不是这样。

    我正在使用更新版本的Android(3.1),因此可能会有效果,但我很想知道可能的原因。另一件事:Eclipse告诉我customIntent是空的,但它并不完全清楚它所指的是什么,而且我也找不到它。

1 个答案:

答案 0 :(得分:2)

答案非常非常简单:我错过了Activity#onCreate中的这一步:

mBillingService = new BillingService()

//THIS STEP IS THE CRITICAL STEP
mBillingService.setContext(this);
//IF ONLY I HAD KNOWN

mBillingService.checkBillingSupported();

这会调用attachBaseContext(context);

现在有效:)