2012-02-11 7 views
1

내 앱을 시작한 다음 중지 또는 일시 중지를 선택하면 Android 앱이 다운됩니다. 먼저 재생을 누른 다음 중지하거나 일시 중지하면 제대로 작동합니다. 구글과 stackoverflow 검색하지만 그것에 대해 많이 찾을 수 없습니다. 나는 문제로 인해 NullPointerException이의 생각하지만 난 새로 온 사람 때문에 너무이 문제에 대해 나에게 많은 것을 말해일시 중지를 누르거나 재생을 클릭하지 않은 순간에 중지하면 Android 라디오 스트리밍 앱이 중단됩니다.

코드하지 않습니다 자바 :

 import android.app.Activity; 
    import android.media.AudioManager; 
    import android.media.MediaPlayer; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 

    public class myMain extends Activity implements 
     MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, 
     MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, OnClickListener { 


     private String TAG = getClass().getSimpleName(); 
     private MediaPlayer mp= null; 

     private Button play; 
     private Button pause; 
     private Button stop; 




     @Override 
     public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     play = (Button) findViewById(R.id.play); 
     pause = (Button) findViewById(R.id.pause); 
     stop = (Button) findViewById(R.id.stop); 




     play.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     play(); 
     } 
     }); 

     pause.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view){ 
     pause(); 
     } 
     }); 

     stop.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view){ 
     stop(); 

     } 
     }); 
     } 


     private void play() { 
     Uri myUri = Uri.parse("url"); 
     try { 
      if (mp == null) { 
      this.mp = new MediaPlayer(); 
      } else { 
      mp.stop(); 
      mp.reset(); 
      } 
     mp.setDataSource(this, myUri); // Go to Initialized state 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnPreparedListener(this); 
     mp.setOnBufferingUpdateListener(this); 

     mp.setOnErrorListener(this); 
     mp.prepareAsync(); 

     Log.d(TAG, "LoadClip Done"); 
     } catch (Throwable t) { 
     Log.d(TAG, t.toString()); 
     } 
     } 

     public void onPrepared(MediaPlayer mp) { 
     Log.d(TAG, "Stream is prepared"); 
     mp.start(); 
     } 

     private void pause() { 
      mp.pause(); 
      } 
     private void stop() { 
      mp.stop(); 

      } 

     @Override 
     public void onDestroy() { 
     super.onDestroy(); 
     stop(); 

     } 

     public void onCompletion(MediaPlayer mp) { 
     stop(); 
     } 

     public boolean onError(MediaPlayer mp, int what, int extra) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("Media Player Error: "); 
     switch (what) { 
     case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: 
     sb.append("Not Valid for Progressive Playback"); 
     break; 
     case MediaPlayer.MEDIA_ERROR_SERVER_DIED: 
     sb.append("Server Died"); 
     break; 
     case MediaPlayer.MEDIA_ERROR_UNKNOWN: 
     sb.append("Unknown"); 
     break; 
     default: 
     sb.append(" Non standard ("); 
     sb.append(what); 
     sb.append(")"); 
     } 
     sb.append(" (" + what + ") "); 
     sb.append(extra); 
     Log.e(TAG, sb.toString()); 
     return true; 
     } 

     public void onBufferingUpdate(MediaPlayer mp, int percent) { 
     Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%"); 
     } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 

     } 

오류 :

 02-11 20:45:43.837: D/AndroidRuntime(338): Shutting down VM 
     02-11 20:45:43.837: W/dalvikvm(338): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
     02-11 20:45:43.857: E/AndroidRuntime(338): FATAL EXCEPTION: main 
     02-11 20:45:43.857: E/AndroidRuntime(338): java.lang.NullPointerException 
     02-11 20:45:43.857: E/AndroidRuntime(338): at   wadio.media.internetradio.myMain.stop(myMain.java:95) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at   wadio.media.internetradio.myMain.access$2(myMain.java:94) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at wadio.media.internetradio.myMain$3.onClick(myMain.java:55) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.view.View.performClick(View.java:2485) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.view.View$PerformClick.run(View.java:9080) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Handler.handleCallback(Handler.java:587) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Handler.dispatchMessage(Handler.java:92) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Looper.loop(Looper.java:123) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at android.app.ActivityThread.main(ActivityThread.java:3683) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at java.lang.reflect.Method.invokeNative(Native Method) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at java.lang.reflect.Method.invoke(Method.java:507) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
     02-11 20:45:43.857: E/AndroidRuntime(338): at dalvik.system.NativeStart.main(Native Method) 

답변

1

stop() 메서드에서 mp 변수에 액세스합니다. 그러나 mp 변수는 재생을 누를 때까지 null입니다 (play() 메서드가 호출 됨). 따라서 null 변수에 액세스하려고하면 NullPointerException이 발생합니다.

NullPointerException을 중지하는 아주 간단한 방법은 같은 것을 할 것입니다 :

private void pause() { 
    if(mp!=null) mp.pause(); 
} 

private void stop() { 
    if(mp!=null) mp.stop(); 
} 

물론이 솔루션이 일시 정지 또는 정지가 두 번 호출되는 경우를 고려하지 않습니다. 상태 관리에 대한 자세한 내용은 MediaPlayer documentation을 참조하십시오.

+0

감사합니다. yydl! 당신의 설정을 입력하면 잘 작동합니다. 또한 미디어 플 레이어 설명서를 확인합니다. 만약 내가 올바르게 이해한다면 (mp! = null) mp.pause(); mp가 null이면 mp를 일시 정지하지 않도록합니다. – Weeman

+0

@ user1204364 정확합니다. – yydl

관련 문제