2013-09-10 6 views
5

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 
+0

увидеть этот http://stackoverflow.com/questions/5610464/stopping-starting-music-on-incoming-calls – Arjun

ответ

3

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

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

Благодаря это работает, но когда телефонный звонок завершено, и оно возвращается к приложению, оно вызывает сбои в работе с журналом. Любая помощь? – user2407147

+0

Я не знаю, поможет ли она, но попытаться удалить mp.release(); из onStop функция. – StevoF

+1

@SteveF: Если вы остановите «MediaPlayer», вы должны снова вызвать 'prepare()' перед вызовом 'start()'. Вместо вызова 'mp.stop()' в методе 'Activity'' onPause() 'вы должны вызвать' mp.pause() '. – Squonk

5

Вам нужно 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; 
    } 
} 
+0

Возможно, в этот код необходимо будет добавить: «case AudioManager.AUDIOFOCUS_LOSS:« код: »audioManager.abandonAudioFocus (this);»? (как говорится в URL-адресе, который вы связали: http://developer.android.com/training/managing-audio/audio-focus.html) –

Смежные вопросы