ユーザーが使用するために支払う必要があるいくつかの機能を持つアプリケーションを開発しています。ユーザーはボタンをクリックすることで、各アクティビティで購入できます。これを行うには、Android アプリ内課金と robotmedia/AndroidBillingLibrary を使用します。HTC Wildfire S (Android 2.3.5) と Asus Transformer Pad (Android 4.1.1) ではすべて正常に動作しているようですが、他のデバイスでは [購入] ボタンをクリックしても何も起こらないことがあるという情報を (ログ キャプチャで) 取得しました。デバイス:
- サムスン Galaxy ACE (Android 2.3.5)
- HTC センセーション (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 アプリ内課金の 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 がスローされるこれらのデバイスでさらに興味深いのは、たまにしか発生しないことです。