MediaPlayer Не останавливается при получении телефонного звонка

MediaPlayer не приостанавливается при получении телефонного звонка. Если кто-то может помочь, это будет здорово!

Код:

public class player1 extends Activity implements Runnable { private MediaPlayer mp; private ProgressBar progressBar; private ImageButton pauseicon; private final int NUM_SOUND_FILES = 3; //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE***** private int mfile[] = new int[NUM_SOUND_FILES]; private Random rnd = new Random(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.player_1); pauseicon = (ImageButton) findViewById(R.id.pauseicon); progressBar = (ProgressBar) findViewById(R.id.progressBar); getActionBar().setDisplayHomeAsUpEnabled(true); mfile[0] = R.raw.sound01; //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES mfile[1] = R.raw.sound02; //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT***** mfile[2] = R.raw.sound03; // Listeners /** * Play button click event * plays a song and changes button to pause image * pauses a song and changes button to play image * */ try{ mp = MediaPlayer.create(player1.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]); mp.seekTo(0); mp.start(); ; progressBar.setVisibility(ProgressBar.VISIBLE); progressBar.setProgress(0); progressBar.setMax(mp.getDuration()); new Thread(this).start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { if (state == TelephonyManager.CALL_STATE_RINGING) { mp.pause(); } else if(state == TelephonyManager.CALL_STATE_IDLE) { //Not in call: Play music } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) { //A call is dialing, active or on hold } super.onCallStateChanged(state, incomingNumber); } }; mp.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { pauseicon.setImageResource(R.drawable.playicon); mp.seekTo(0); } }); pauseicon.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if(mp.isPlaying()) { mp.pause(); ((ImageButton) v).setImageResource(R.drawable.playicon); } else { mp.start(); ((ImageButton) v).setImageResource(R.drawable.pauseicon); } } }); } static boolean runThread = true; public void run() { while ( runThread ) { int currentPosition=0; int total = mp.getDuration(); if ( mp != null && currentPosition <= total ) { try { Thread.sleep(1000); currentPosition= mp.getCurrentPosition(); } catch (InterruptedException e) { return; } catch (Exception e) { return; } progressBar.setProgress(currentPosition); } else try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } runThread = false; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); if (mp != null) if(mp.isPlaying()) mp.stop(); mp.release(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed(){ if (mp != null){ if(mp.isPlaying()) mp.stop(); mp.release(); } //there is no reason to call super.finish(); here //call super.onBackPressed(); and it will finish that activity for you super.onBackPressed(); } } 

Новая ошибка

  09-10 19:41:45.250: E/AndroidRuntime(18428): FATAL EXCEPTION: main 09-10 19:41:45.250: E/AndroidRuntime(18428): java.lang.RuntimeException: Unable to pause activity {com.example.mediaplayer/com.example.mediaplayer.player1}: java.lang.IllegalStateException 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3064) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3019) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2997) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.access$800(ActivityThread.java:141) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1273) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.os.Handler.dispatchMessage(Handler.java:99) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.os.Looper.loop(Looper.java:137) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.main(ActivityThread.java:5103) 09-10 19:41:45.250: E/AndroidRuntime(18428): at java.lang.reflect.Method.invokeNative(Native Method) 09-10 19:41:45.250: E/AndroidRuntime(18428): at java.lang.reflect.Method.invoke(Method.java:525) 09-10 19:41:45.250: E/AndroidRuntime(18428): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-10 19:41:45.250: E/AndroidRuntime(18428): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-10 19:41:45.250: E/AndroidRuntime(18428): at dalvik.system.NativeStart.main(Native Method) 09-10 19:41:45.250: E/AndroidRuntime(18428): Caused by: java.lang.IllegalStateException 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.media.MediaPlayer.isPlaying(Native Method) 09-10 19:41:45.250: E/AndroidRuntime(18428): at com.example.mediaplayer.player1.onPause(player1.java:172) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.Activity.performPause(Activity.java:5235) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1233) 09-10 19:41:45.250: E/AndroidRuntime(18428): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3050) 09-10 19:41:45.250: E/AndroidRuntime(18428): ... 12 more 

Для управления фокусом аудио вам нужен AudioManager . Вот подробное объяснение того, как это работает: http://developer.android.com/training/managing-audio/audio-focus.html .

Вот простой пример, показывающий, как реализовать его в вашем приложении: http://developer.android.com/guide/topics/media/mediaplayer.html#audiofocus .

Несмотря на то, что в любой момент времени может работать только одно действие, Android – это многозадачная среда. Это создает особую проблему для приложений, использующих аудио, потому что есть только один аудиовыход, и может быть несколько медиа-сервисов, конкурирующих за его использование. Перед Android 2.2 не было встроенного механизма для решения этой проблемы, что в некоторых случаях приводило к плохому пользовательскому опыту. Например, когда пользователь слушает музыку, а другое приложение должно уведомить пользователя о чем-то очень важном, пользователь может не услышать тональный сигнал уведомления из-за громкой музыки. Начиная с Android 2.2, платформа предлагает пользователям возможность обсуждать использование аудиовыхода устройства. Этот механизм называется Audio Focus.

Пример реализации:

 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // could not get audio focus. } .... .... public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: // resume playback if (mMediaPlayer == null) initMediaPlayer(); else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start(); mMediaPlayer.setVolume(1.0f, 1.0f); break; case AudioManager.AUDIOFOCUS_LOSS: // Lost focus for an unbounded amount of time: stop playback and release media player if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // Lost focus for a short time, but we have to stop // playback. We don't release the media player because playback // is likely to resume if (mMediaPlayer.isPlaying()) mMediaPlayer.pause(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // Lost focus for a short time, but it's ok to keep playing // at an attenuated level if (mMediaPlayer.isPlaying()) mMediaPlayer.setVolume(0.1f, 0.1f); break; } } 

Попробуйте добавить эти функции в свою деятельность.

 @Override public void onPause() { super.onPause(); if (mp != null){ if(mp.isPlaying()) mp.pause(); } } @Override public void onResume() { super.onResume(); if (mp != null){ if(!mp.isPlaying()) mp.prepare(); mp.start(); } } @Override public void onStop() { super.onStop(); if (mp != null){ if(mp.isPlaying()) mp.pause(); } }