我正在开发一个应用程序,它将具有用户必须付费才能使用的某些功能。用户可以通过单击按钮在每个 Activity 中购买。为此,我使用Android应用内结算和robotmedia / 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
    

    这是我的 Activity 代码的一部分:
    @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的设备上,更有趣的是,它仅在某些时候发生。

    最佳答案

    它是robotmedias实现中的一个错误,您只需要将服务重新绑定到您的 Activity 即可。

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

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

    10-05 23:55