¿Por qué NullPointerException ocurre con el uso de BillingService estándar?

Utilizo el servicio de BillingService estándar en mi aplicación (es decir, copiado de la aplicación de muestra sin cambios). Pero a veces mi aplicación se bloquea con los siguientes datos en logcat:

 04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003} 04-16 10:05:43.646: DEBUG/AndroidRuntime(28748): Shutting down VM 04-16 10:05:43.656: WARN/dalvikvm(28748): threadid=1: thread exiting with uncaught exception (group=0x400259f8) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): FATAL EXCEPTION: main 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@4632f578 with null: java.lang.NullPointerException 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.access$3600(ActivityThread.java:135) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Handler.dispatchMessage(Handler.java:99) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Looper.loop(Looper.java:144) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.main(ActivityThread.java:4937) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invokeNative(Native Method) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invoke(Method.java:521) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at dalvik.system.NativeStart.main(Native Method) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): Caused by: java.lang.NullPointerException 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at tv.kinobaza.billing.BillingService.onStart(Unknown Source) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.Service.onStartCommand(Service.java:420) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): ... 10 more 04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1 04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1 04-16 10:05:43.766: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0xb947a8), index=0, pid=96, w=480, h=418 success 04-16 10:05:43.986: DEBUG/dalvikvm(28721): GC_FOR_MALLOC freed 9604 objects / 1369120 bytes in 102ms 

Aquí está el código relacionado:

 /** * We don't support binding to this service, only starting the service. */ @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startId) { handleCommand(intent, startId); } 

¿Qué está mal aquí?

Lo que he notado – cuando el dispositivo duerme durante la noche, una vez que empiece a usarlo, se bloquea dentro de ~ 5 minutos.

Y, aquí hay más detalles: BillingService comenzó desde la pantalla de Preferencias de mi aplicación. Aquí el código de la clase Preferences :

 @Override protected void onDestroy() { mBillingService.unbind(); super.onDestroy(); } 

Actualización. Probablemente, debo iniciar este servicio / desvincularme en la actividad principal.

Aquí está mi proguard.cfg:

 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep class com.android.vending.billing.** -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -libraryjars /lib/libGoogleAnalytics.jar -libraryjars /lib/signpost-commonshttp4-1.2.1.1.jar -libraryjars /lib/signpost-core-1.2.1.1.jar -dontwarn org.apache.commons.codec.binary.Base64 

2 Solutions collect form web for “¿Por qué NullPointerException ocurre con el uso de BillingService estándar?”

Así que obtienes este NPE después de proguard y no de antemano.

Usted debe estar ofuscando algo que no debería gustar una clase extendiendo Aplicación / Actividad / Servicio

No debes ofuscar estas clases:

http://proguard.sourceforge.net/index.html#/manual/examples.html (Ir al Ejemplo 7)

Sólo señalando lo obvio, pero si proguard eran el problema, entonces no veríamos su nombre de servicio de facturación en el rastro de la pila. (Veríamos un nombre ofuscado, y no tv.kinobaza.billing.BillingService.onStart).

Pruebe esto ¿Por qué el servicio Android falla con NullPointerException?

  • Servicio de Android: onBind (Intención) y onUnbind (Intención) se llama una sola vez
  • Subida de imágenes de Android: ¿Utilizar actividad o servicio?
  • ¿Hay una alternativa onBackPressed () para un servicio?
  • PopUp diálogo Android de hilo de fondo
  • Grabar sonido Y reproducir sonido modulado En Android?
  • Actividad de Android sin GUI
  • Cómo detectar la visibilidad del selector de método de entrada sin el permiso de accesibilidad
  • MVC en Android: ¿Aplicación o servicio para actualizaciones asíncronas?
  • ¿Cómo comprobar el permiso automático de MIUI mediante programación?
  • El punto de interrupción en servicio no funciona
  • El micrófono Android no funciona cuando se utiliza por otra aplicación en el servicio de fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.