AndroidBillingLibrary: Servicio remoto se bloqueó en BillingController.requestPurchase

Estoy desarrollando una aplicación que tendrá algunas características que el usuario debe pagar para usar. El usuario puede comprar en cada actividad haciendo clic en el botón. Para ello, utilizo la facturación en aplicaciones Android y el robotmedia / AndroidBillingLibrary. Todo parece funcionar bien en mis dispositivos: HTC Wildfire S (Android 2.3.5) y Asus Transformer Pad (Android 4.1.1), pero tengo información (con captura de registro) que a veces en otros dispositivos después de hacer clic en botón de compra no pasa nada. Los dispositivos:

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

Aquí está la captura de registro:

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 

Esto es parte del código de mi Actividad:

 @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); } 

En este código siempre compruebo si un dispositivo está en línea y si se admite la Facturación en la aplicación. Parece que IMarketBillingService de Google In-App Billing lanza RemoteException y se captura en robotmedia / AndroidBillingLibrary en la clase BillingService:

 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? } } 

¿Puede alguien explicarme por qué se lanza RemoteException? ¿Y cómo manejarlo? He hecho muchas pruebas pero en mis dispositivos la facturación en la aplicación siempre funciona correctamente. Lo que es más interesante en estos dispositivos donde se dispara RemoteException, sólo sucede a veces.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.