我正在开发一个应用程序,它具有一些用户必须付费才能使用的功能。用户可以通过点击按钮在每个活动中购买。为此,我使用 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 的设备上更有趣的是,它只是偶尔发生。