2012-12-12 3 views
2

내 활동에 버튼이 있습니다. 버튼을 클릭하면 전화가 finish()이고 문제는 내가 전화를 걸어 Illegal state exception입니다. 도와주세요. 여기 불법 상태 예외 미디어 플레이어

import java.io.IOException; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.MediaController; 
import android.widget.MediaController.MediaPlayerControl; 

import com.mds.perfumastic.R; 
import com.mds.perfumastic.constants.Constants; 

public class AudioPlayerActivity extends Activity implements 
    OnPreparedListener , MediaPlayerControl{ 
    private Handler handler = new Handler(); 
    private final MediaPlayer mediaPlayer = new MediaPlayer(); 
    private MediaController mediaController; 
    private ProgressDialog progressBar; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_audioplayer); 
     progressBar = new ProgressDialog(this); 
     progressBar.setMessage("Playing..."); 
     progressBar.show(); 
     String audioUrl = getIntent().getStringExtra(Constants.INTENT_EXTRA_AUDIO_URL); 
     mediaController = new MediaController(this); 


     try { 
      mediaPlayer.setOnPreparedListener(this); 
      mediaPlayer.reset(); 
      mediaPlayer.setDataSource(audioUrl); 
      mediaPlayer.prepare(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     progressBar.dismiss(); 
     if (mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
     mediaPlayer.release(); 
    } 

    // --MediaPlayerControl 
      // methods---------------------------------------------------- 
      public void start() { 
       mediaPlayer.start(); 
      } 

      public void pause() { 
       mediaPlayer.pause(); 
      } 

      public int getDuration() { 
       return mediaPlayer.getDuration(); 
      } 

      public int getCurrentPosition() { 
       return mediaPlayer.getCurrentPosition(); 
      } 

      public void seekTo(int i) { 
       mediaPlayer.seekTo(i); 
      } 

      public boolean isPlaying() { 
       return mediaPlayer.isPlaying(); 
      } 

      public int getBufferPercentage() { 
       return 0; 
      } 

      public boolean canPause() { 
       return true; 
      } 

      public boolean canSeekBackward() { 
       return true; 
      } 

      public boolean canSeekForward() { 
       return true; 
      } 

      // -------------------------------------------------------------------------------- 

      public void onPrepared(final MediaPlayer mediaPlayer) { 
       Log.d("TAG", "onPrepared"); 
       progressBar.hide(); 
       mediaController.setMediaPlayer(this); 
       mediaController.setAnchorView(findViewById(R.id.newView)); 
       mediaPlayer.start(); 

       handler.post(new Runnable() { 
        public void run() { 
         mediaController.setEnabled(true); 
         mediaController.show(mediaPlayer.getDuration()); 
        } 
       }); 
      } 
      /** Use screen touches to toggle the video between playing and paused. */ 
      @Override 
      public boolean onTouchEvent(MotionEvent ev) { 
       if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
        if (mediaPlayer.isPlaying()) { 
         mediaPlayer.pause(); 
        } else { 
         mediaPlayer.start(); 
         mediaController.show(mediaPlayer.getDuration()); 
        } 
        return true; 
       } else { 
        return false; 
       } 
      } 
      public void onClick(View v) { 
       if(v.getId() == R.id.btn_back) { 

        finish(); 
       } 
      } 

} 

는 로그 메시지입니다 :

12-12 11:55:34.791: E/AndroidRuntime(1336): FATAL EXCEPTION: main 
12-12 11:55:34.791: E/AndroidRuntime(1336): java.lang.IllegalStateException 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.media.MediaPlayer.getCurrentPosition(Native Method) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at com.mds.perfumastic.activites.AudioPlayerActivity.getCurrentPosition(AudioPlayerActivity.java:80) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.widget.MediaController.setProgress(MediaController.java:415) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.widget.MediaController.access$500(MediaController.java:71) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.widget.MediaController$3.handleMessage(MediaController.java:386) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.os.Looper.loop(Looper.java:137) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-12 11:55:34.791: E/AndroidRuntime(1336):  at dalvik.system.NativeStart.main(Native Method) 

답변

4

이 예외의 한 가지 가능한 원인은 MediaController 여전히 당신이 Activity을 마무리하고 출시 않더라도으로 현재의 위치에 대한 MediaPlayer 객체를 조회 할 수 있다는 것입니다 MediaPlayer 개체. mediaPlayer.stop()을 수행하기 전에 mediaController.hide()을 추가하십시오. 당신이 finish를 호출하고 있기 때문에

당신은 또한 onPauseActivity이 백그라운드로 전환 할 때입니다 때문에, onDestroy을 무시하고 싶지만 아직 살아 있습니다.

+0

우리는 일시 중지 상태를 거치지 않고 상태를 파괴 할 수 없습니다. finish()가 호출 될 때 pause 메서드가 호출됩니다. – arun

+0

Activity를 완료하면 onPause가 호출 될 수 있지만 Activity가 백그라운드로 들어갈 때 호출됩니다 그러나 여전히 살아있다. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle을 참조하십시오. – Michael

1

현재 MediaPlayer class을 사용하는 프로젝트를 진행 중입니다. 앱이 onDestroyonBackPressed 상태가되면 오류가 발생했습니다. 하지만 이미 mp.release()이라는 메서드를 호출하여 mediaplayer object.을 호출했습니다.하지만 충분하지 않았습니다. 여전히 같은 오류가 발생했습니다. 오류는 my Handler에서 사용하는 getDuration() 방법 때문이었습니다. 여기

mHandler.removeCallbacks(mUpdateTimeTask); 

mHandler 내 처리기 개체이며 mUpdateTimeTask는 Runnable를하다 : 그래서 난 그냥 mp.release();를 호출하기 전에 removeCallbacks() 방법을 추가 할 수 있습니다.

나를 위해 일했습니다!. 그렇게하면 "IllegalStateException"오류가 발생하지 않습니다. 이 솔루션이 다른 사람들을 돕기를 바랍니다.