Android Open Source - AudioPlayerRecorder Audio Player Handler






From Project

Back to project page AudioPlayerRecorder.

License

The source code is released under:

MIT License

If you think the Android project AudioPlayerRecorder listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.heavyplayer.audioplayerrecorder.util;
//from  ww  w  .j a  va2 s.  c  o m
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import com.heavyplayer.audioplayerrecorder.widget.AudioPlayerLayout;
import com.heavyplayer.audioplayerrecorder.widget.PlayPauseImageButton;
import com.heavyplayer.audioplayerrecorder.widget.interface_.OnDetachListener;

import java.io.IOException;

public class AudioPlayerHandler implements
    MediaPlayer.OnPreparedListener,
    SafeMediaPlayer.OnStartListener,
    MediaPlayer.OnCompletionListener,
    MediaPlayer.OnBufferingUpdateListener,
    MediaPlayer.OnErrorListener {
  public static final String LOG_TAG = AudioPlayerHandler.class.getSimpleName();

  private final static long PROGRESS_UPDATE_INTERVAL_MS = 200;

  private AudioManager mAudioManager;
  private AudioFocusChangeListener mAudioFocusChangeListener;

  private Uri mFileUri;

  private boolean mShowBufferIfPossible;

  private Handler mHandler;
  private ProgressUpdater mProgressUpdater;

  private SafeMediaPlayer mMediaPlayer;
  private Integer mBufferingCurrentPosition;

  private AudioPlayerLayout mView;
  private PlayPauseImageButton mButton;
  private SeekBar mSeekBar;

  public AudioPlayerHandler(Context context, Uri fileUri, boolean showBufferIfPossible, Handler handler) {
    mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

    mFileUri = fileUri;

    mShowBufferIfPossible = showBufferIfPossible;

    mHandler = handler;
    mProgressUpdater = new ProgressUpdater();

    create();
  }

  protected void create() {
    mMediaPlayer = new SafeMediaPlayer();
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnStartListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnErrorListener(this);

    mBufferingCurrentPosition = null;

    configureRegisteredViews();
  }

  public void destroy() {
    clearRegisteredViews();

    if(mMediaPlayer != null) {
      try {
        mMediaPlayer.setOnPreparedListener(null);
        mMediaPlayer.setOnStartListener(null);
        mMediaPlayer.setOnCompletionListener(null);
        mMediaPlayer.setOnBufferingUpdateListener(null);
        mMediaPlayer.setOnErrorListener(null);
        mMediaPlayer.stop();
        mMediaPlayer.reset();
        mMediaPlayer.release();
        mMediaPlayer = null;
      }
      catch(Exception e) {
        Log.w(LOG_TAG, e);
      }
    }

    mBufferingCurrentPosition = null;

    abandonAudioFocus();
  }

  protected void start(boolean gainAudioFocus, boolean updateButton) {
    if(gainAudioFocus)
      gainAudioFocus();

    if(!mMediaPlayer.isPreparing() && !mMediaPlayer.isPrepared()) {
      try {
        mMediaPlayer.setDataSource(mFileUri.toString());
        mMediaPlayer.prepare();
      } catch (IOException e) {
        Log.w(LOG_TAG, e);
      }
    }

    mMediaPlayer.start();

    updatePlayingState(true, updateButton);
  }

  protected void pause(boolean abandonAudioFocus, boolean updateButton) {
    mMediaPlayer.pause();

    updatePlayingState(false, updateButton);

    if(abandonAudioFocus)
      abandonAudioFocus();
  }

  protected void seekTo(int msec) {
    mMediaPlayer.seekTo(msec);
  }

  protected void updatePlayingState(boolean isPlaying, boolean updateButton) {
    if(mView != null)
      mView.setIsPlaying(isPlaying);

    if(mButton != null && updateButton)
      mButton.setIsPlaying(isPlaying);
  }

  @Override
  public void onPrepared(MediaPlayer mp) {
    if(mView != null)
      mView.setTimeDuration(mp.getDuration());

    if(mSeekBar != null) {
      if(mSeekBar.getMax() != mp.getDuration()) {
        mSeekBar.setMax(mp.getDuration());
        mSeekBar.setProgress(mp.getCurrentPosition());
      }
      else if(mSeekBar.getProgress() != mp.getCurrentPosition()) {
        mSeekBar.setProgress(mp.getCurrentPosition());
      }
    }
  }

  @Override
  public void onStart(MediaPlayer mp) {
    // Update seek bar.
    startSeekBarUpdate();
  }

  public void startSeekBarUpdate() {
    // Update seek bar.
    mHandler.removeCallbacks(mProgressUpdater);
    mHandler.post(mProgressUpdater);
  }

  @Override
  public void onCompletion(MediaPlayer mp) {
    // Updates seek bar.
    if(mSeekBar != null)
      mSeekBar.setProgress(mp.getCurrentPosition());

    updatePlayingState(false, true);

    abandonAudioFocus();
  }

  @Override
  public void onBufferingUpdate(MediaPlayer mp, int percent) {
    if(mShowBufferIfPossible) {
      mBufferingCurrentPosition = (int)(mp.getDuration() * (percent / 100f));

      if(mSeekBar != null)
        mSeekBar.setSecondaryProgress(mBufferingCurrentPosition);
    }
  }

  @Override
  public boolean onError(MediaPlayer mp, int what, int extra) {
    if(what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
      // Recreate media player.
      destroy();
      create();
    }
    else {
      abandonAudioFocus();
    }

    return false;
  }

  public void registerView(AudioPlayerLayout view) {
    mView = view;
    mView.setOnDetachListener(new OnDetachListener() {
      @Override
      public void onStartTemporaryDetach(View v) {
        clearRegisteredViews();
      }

      @Override
      public void onDetachedFromWindow(View v) {
        clearRegisteredViews();
      }
    });

    mButton = view.getButton();
    mSeekBar = view.getSeekBar();

    configureRegisteredViews();

    // Resume updater.
    startSeekBarUpdate();
  }

  protected void configureRegisteredViews() {
    configureView();
    configureButton();
    configureSeekBar();
  }

  protected void configureView() {
    if(mView != null && mMediaPlayer != null) {
      // Resume duration.
      // Don't worry about current position as it will
      // always be correlated with the seek bar position.
      mView.setTimeDuration(mMediaPlayer.getDuration());

      // Resume playing state.
      mView.setIsPlaying(mMediaPlayer.isGoingToPlay());
    }
  }

  protected void configureButton() {
    if(mButton != null && mMediaPlayer != null) {
      mButton.setOnPlayPauseListener(new PlayPauseImageButton.OnPlayPauseListener() {
        @Override
        public void onPlay(View v) {
          start(true, false);
        }

        @Override
        public void onPause(View v) {
          pause(true, false);
        }
      });

      // Resume playing state.
      mButton.setIsPlaying(mMediaPlayer.isGoingToPlay());
    }
  }

  protected void configureSeekBar() {
    if(mSeekBar != null && mMediaPlayer != null) {
      mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
          mHandler.removeCallbacks(mProgressUpdater);
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
          seekTo(seekBar.getProgress());
          mHandler.post(mProgressUpdater);
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
          mView.setTimeCurrentPosition(progress);
        }
      });

      // Resume progress.
      mSeekBar.setMax(mMediaPlayer.getDuration());
      mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
      mSeekBar.setSecondaryProgress(mBufferingCurrentPosition != null ? mBufferingCurrentPosition : 0);
    }
  }

  protected void clearRegisteredViews() {
    if(mView != null) {
      mView.setOnDetachListener(null);
      mView = null;
    }

    if(mButton != null) {
      mButton.setOnPlayPauseListener(null);
      mButton = null;
    }

    if(mSeekBar != null) {
      mSeekBar.setOnSeekBarChangeListener(null);
      mSeekBar = null;
    }
  }

  protected void gainAudioFocus() {
    if(mAudioFocusChangeListener == null)
      mAudioFocusChangeListener = new AudioFocusChangeListener();

    // Request audio focus for playback
    mAudioManager.requestAudioFocus(
        mAudioFocusChangeListener,
        AudioManager.STREAM_MUSIC,
        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
  }

  protected void abandonAudioFocus() {
    // Abandon audio focus when playback complete.
    if(mAudioFocusChangeListener != null)
      mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
  }

  private class AudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener {
    @Override
    public void onAudioFocusChange(int focusChange) {
      switch(focusChange) {
        case AudioManager.AUDIOFOCUS_LOSS:
          pause(true, true);
          break;
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
          pause(false, true);
          break;
        case AudioManager.AUDIOFOCUS_GAIN:
          start(false, true);
          break;
      }
    }
  }

  protected class ProgressUpdater implements Runnable {
    @Override
    public void run() {
      if(mSeekBar != null && mMediaPlayer != null && mMediaPlayer.isPlaying()) {
        mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
        mHandler.postDelayed(this, PROGRESS_UPDATE_INTERVAL_MS);
      }
    }
  }
}




Java Source Code List

com.heavyplayer.audioplayerrecorder.fragment.AudioRecorderFragment.java
com.heavyplayer.audioplayerrecorder.sample.activity.PlayerActivity.java
com.heavyplayer.audioplayerrecorder.sample.activity.RecorderActivity.java
com.heavyplayer.audioplayerrecorder.sample.obj.Item.java
com.heavyplayer.audioplayerrecorder.service.AudioPlayerService.java
com.heavyplayer.audioplayerrecorder.service.AudioRecorderService.java
com.heavyplayer.audioplayerrecorder.service.manager.AudioPlayerServiceManager.java
com.heavyplayer.audioplayerrecorder.service.manager.AudioRecorderServiceManager.java
com.heavyplayer.audioplayerrecorder.service.manager.ServiceManager.java
com.heavyplayer.audioplayerrecorder.util.AudioPlayerHandler.java
com.heavyplayer.audioplayerrecorder.util.BuildUtils.java
com.heavyplayer.audioplayerrecorder.util.SafeMediaPlayer.java
com.heavyplayer.audioplayerrecorder.utils.AudioUtils.java
com.heavyplayer.audioplayerrecorder.widget.AudioPlayerLayout.java
com.heavyplayer.audioplayerrecorder.widget.AudioRecorderMicrophone.java
com.heavyplayer.audioplayerrecorder.widget.PlayPauseImageButton.java
com.heavyplayer.audioplayerrecorder.widget.interface_.OnDetachListener.java