我正在开发一个应用程序,它将具有用户必须付费才能使用的某些功能。用户可以通过单击按钮在每个 Activity 中购买。为此,我使用Android应用内结算和robotmedia / AndroidBillingLibrary。一切似乎都可以在我的设备上正常运行:HTC Wildfire S(Android 2.3.5)和Asus Transformer Pad(Android 4.1.1),但是我得到的信息(带有日志捕获)有时在单击“购买”按钮后在其他设备上没有任何反应。
设备:
这是日志捕获:
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