MediaPlayer No se detiene cuando se recibe una llamada telefónica

MediaPlayer no se detiene cuando se recibe una llamada telefónica. Si alguien puede ayudar sería genial!

Código:

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(); } } 

Nuevo error

  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 

Necesita un AudioManager para gestionar el enfoque de audio. Aquí está una explicación pulcra de cómo trabaja: http://developer.android.com/training/managing-audio/audio-focus.html .

Este es un ejemplo sencillo que muestra cómo implementarlo en su aplicación: http://developer.android.com/guide/topics/media/mediaplayer.html#audiofocus .

Aunque sólo se puede ejecutar una actividad en un momento dado, Android es un entorno multitarea. Esto plantea un desafío particular a las aplicaciones que utilizan audio, porque sólo hay una salida de audio y puede haber varios servicios de medios que compiten por su uso. Antes de Android 2.2, no había ningún mecanismo incorporado para abordar este problema, lo que podría en algunos casos conducir a una mala experiencia de usuario. Por ejemplo, cuando un usuario está escuchando música y otra aplicación necesita notificar al usuario de algo muy importante, es posible que el usuario no escuche el tono de notificación debido a la música alta. A partir de Android 2.2, la plataforma ofrece una forma para que las aplicaciones negocien su uso de la salida de audio del dispositivo. Este mecanismo se denomina Audio Focus.

Ejemplo de implementación:

 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; } } 

Intente agregar estas funciones a su actividad.

 @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(); } } 
  • Android: Hacer una llamada telefónica desde el servicio
  • Cómo grabar la llamada en android? ¿Es posible?
  • Android cheque tiene llamada telefónica activa
  • ¿Cómo puedo grabar voz y grabar llamadas en Android?
  • ¿Qué información puedo obtener durante una llamada telefónica utilizando la API de Android?
  • No se ha encontrado actividad para manejar la acción intencional.
  • Reenvío de llamadas
  • Realizar llamadas sin actividad ACTION_CALL
  • ¿Cómo puedo hacer una llamada telefónica en android y volver a mi actividad cuando se realiza la llamada?
  • ¿Cómo puedo llamar al número de emergencia mediante programación
  • Desvío de llamadas de android mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.