Bloqueo del puntero nulo del botón Atrás de Android Media Player

Tengo el resto de mi aplicación funcionando sorprendentemente bien hasta que se presiona el botón Atrás para detener y salir del programa. No sabía si es esta parte de la línea de código o dónde, pero aquí está el logcat de DDMS y debajo está la codificación del botón Atrás. Cualquier ayuda sería muy apreciada.

05-03 18:32:35.597: W/KeyCharacterMap(475): No keyboard for id 0
05-03 18:32:35.597: W/KeyCharacterMap(475): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-03 18:32:35.667: D/AndroidRuntime(475): Shutting down VM
05-03 18:32:35.677: W/dalvikvm(475): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
05-03 18:32:35.736: E/AndroidRuntime(475): FATAL EXCEPTION: main
05-03 18:32:35.736: E/AndroidRuntime(475): java.lang.NullPointerException
05-03 18:32:35.736: E/AndroidRuntime(475):  at com.mrj05hua.skylanders.SkylandersSoundboardActivity.onBackPressed(SkylandersSoundboardActivity.java:344)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.app.Activity.onKeyUp(Activity.java:1888)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.app.Activity.dispatchKeyEvent(Activity.java:2068)
05-03 18:32:35.736: E/AndroidRuntime(475):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.os.Looper.loop(Looper.java:123)
05-03 18:32:35.736: E/AndroidRuntime(475):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-03 18:32:35.736: E/AndroidRuntime(475):  at java.lang.reflect.Method.invokeNative(Native Method)
05-03 18:32:35.736: E/AndroidRuntime(475):  at java.lang.reflect.Method.invoke(Method.java:521)
05-03 18:32:35.736: E/AndroidRuntime(475):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-03 18:32:35.736: E/AndroidRuntime(475):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-03 18:32:35.736: E/AndroidRuntime(475):  at dalvik.system.NativeStart.main(Native Method)
05-03 18:32:39.327: I/Process(475): Sending signal. PID: 475 SIG: 9
05-03 18:36:59.016: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 873 objects / 61256 bytes in 96ms
05-03 18:36:59.316: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 276 objects / 13632 bytes in 70ms
05-03 18:36:59.626: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 139 objects / 7040 bytes in 82ms
05-03 18:36:59.936: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 88 objects / 4552 bytes in 78ms
05-03 18:37:00.416: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 96 objects / 5184 bytes in 92ms
05-03 18:37:00.826: D/dalvikvm(484): GC_EXTERNAL_ALLOC freed 101 objects / 5520 bytes in 90ms
05-03 18:37:35.257: W/KeyCharacterMap(484): No keyboard for id 0
05-03 18:37:35.257: W/KeyCharacterMap(484): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-03 18:37:35.336: D/AndroidRuntime(484): Shutting down VM
05-03 18:37:35.349: W/dalvikvm(484): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
05-03 18:37:35.427: E/AndroidRuntime(484): FATAL EXCEPTION: main
05-03 18:37:35.427: E/AndroidRuntime(484): java.lang.NullPointerException
05-03 18:37:35.427: E/AndroidRuntime(484):  at com.mrj05hua.skylanders.SkylandersSoundboardActivity.onBackPressed(SkylandersSoundboardActivity.java:344)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.app.Activity.onKeyUp(Activity.java:1888)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.app.Activity.dispatchKeyEvent(Activity.java:2068)
05-03 18:37:35.427: E/AndroidRuntime(484):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.os.Looper.loop(Looper.java:123)
05-03 18:37:35.427: E/AndroidRuntime(484):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-03 18:37:35.427: E/AndroidRuntime(484):  at java.lang.reflect.Method.invokeNative(Native Method)
05-03 18:37:35.427: E/AndroidRuntime(484):  at java.lang.reflect.Method.invoke(Method.java:521)
05-03 18:37:35.427: E/AndroidRuntime(484):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-03 18:37:35.427: E/AndroidRuntime(484):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-03 18:37:35.427: E/AndroidRuntime(484):  at dalvik.system.NativeStart.main(Native Method)

--

       @Override 
  public void onBackPressed(){
     //Handles back button to close MediaPlayer
        if (player.isPlaying()) {
            super.finish();
        }
        else if (player.isPlaying())
              player.stop();
          player.release();
          super.finish();
  }

preguntado el 03 de mayo de 12 a las 20:05

1 Respuestas

Bueno, por un lado, tienes una instrucción if redundante

if (player.isPlaying()) 
...
else if (player.isPlaying())
...

Está comprobando lo mismo en ambas declaraciones.

A continuación, la razón por la que obtiene el puntero nulo es porque player probablemente sea nulo cuando intentas acceder a él

Asegúrate de verificar si el reproductor es nulo antes de acceder a él.

@Override 
public void onBackPressed(){
  if (player != null){
      if(player.isPlaying())
          player.stop();

      player.release();
  }

  //there is no reason to call super.finish(); here
  //call super.onBackPressed(); and it will finish that activity for you
  super.onBackPressed(); 
}

contestado el 03 de mayo de 12 a las 20:05

Gracias, me ajusté a este código y sigo recibiendo el mismo error cuando el reproductor no hace nada y el usuario presiona el botón Atrás para cerrarlo a la fuerza. Sé que != significa que no es nulo, pero no aceptará player == null como el comando else if. alguna idea sobre esa parte de este tema. - mr.j05hua

No importa, su código funciona muy bien, encontré mi error donde lo olvidé y coloqué un player.release(); en la destrucción, después de limpiar eso, funciona increíblemente bien. Gracias por resolver ese acertijo de un mes para mí. - mr.j05hua

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.