4

我正在开发一个应用程序,它具有一些用户必须付费才能使用的功能。用户可以通过点击按钮在每个活动中购买。为此,我使用 Android In-app billing 和 robotsmedia/AndroidBillingLibrary。一切似乎在我的设备上运行良好:HTC Wildfire S (Android 2.3.5) 和 Asus Transformer Pad (Android 4.1.1) 但我得到的信息(带有日志捕获)有时在其他设备上单击购买按钮后没有任何反应。设备:

  • 三星 Galaxy ACE (Android 2.3.5)
  • HTC Sensation (Andorid 4.0.3)
  • Xperia Neo V (Android 2.3.4)

这是日志捕获:

11-30 15:05:16.157: D/Parent Activity:(30220): Request Purchase: myitem
11-30 15:05:16.177: W/BillingService(30220): Remote billing service crashed
11-30 15:05:16.177: W/BillingService(30220): Caused by: null

这是我的活动代码的一部分:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
        super.onCreate(savedInstanceState);
        (...)
        initViews();
        initBilling();
}

@Override
protected void onDestroy()
{
    BillingController.unregisterObserver(mBillingObserver);
    (...)
    super.onDestroy();
}

private void initBilling()
{
    mBillingObserver = new BillingObserver(this);
    BillingController.registerObserver(mBillingObserver);
    BillingController.setConfiguration(new BillingConfiguration());
    BillingController.checkBillingSupported(getApplicationContext());
    if (!mBillingObserver.isTransactionsRestored()) {
        BillingController.restoreTransactions(getApplicationContext());
    }
    Settings.updateOwnedItems(this);
}

private void showPurchaseAlert()
{
    if(Settings.isOnline() && BillingController.checkBillingSupported(this) == BillingStatus.SUPPORTED)
    {
    (...)
        ((Button) alertRoot.findViewById(R.id.alert_billing_yes))
            .setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        requestPurchase(BillingElement.CATALOG[number].sku);
                        alert.cancel();
                }
            });
    }
    else
    {
      (...)
      //Purchase Alert Invisible
    }
}

public void requestPurchase(String itemId) 
{
    Log.d("Parent Activity:", "Request Purchase: "+itemId);
    BillingController.requestPurchase(getApplicationContext(), itemId, true, null);
}

在这段代码中,我总是检查设备是否在线以及是否支持应用内计费。似乎来自 Google In-App Billing 的 IMarketBillingService 抛出 RemoteException 并且它在 BillingService 类的 robotmedia/AndroidBillingLibrary 中被捕获:

private void runRequest(BillingRequest request){
    try {
        long requestId = request.run(mService);
        BillingController.onRequestSent(requestId, request);
    } catch (RemoteException e) {
        Log.w(this.getClass().getSimpleName(), "Remote billing service crashed");
        Log.w(this.getClass().getSimpleName(), "Caused by: "+e.getCause());

        // TODO: Retry?
    }
}

谁能解释我为什么抛出 RemoteException ?以及如何处理?我做了很多测试,但在我的设备上,应用内计费始终正常工作。在这些引发 RemoteException 的设备上更有趣的是,它只是偶尔发生。

4

1 回答 1

1

它是 robotsmedias 实现中的一个错误,您只需将服务重新绑定到您的活动。

hpique 在他的 fork 中修复了它(和其他一些错误):https ://github.com/hpique/AndroidBillingLibrary/commit/a62593764172d0fd650b1dca1d15c59e79aecd49

看看https://github.com/hpique/AndroidBillingLibrary

于 2013-05-25T10:45:40.737 回答