1.使用MediaPlayer播放音频文件

使用MediaPlayer播放音频文件

MediaPlayer 概览 | Android 开发者 | Android Developers (google.cn)

MediaPlayer | Android Developers (google.cn)

1. 应用需求

  1. 异步播放,利用服务进行后台播放;(暂时没有实现音频焦点转移的功能)
  2. 显示音频文件列表,选中不同的歌曲,播放不同的音频文件(未实现);
  3. 添加进度条,实现音频进度可调整。(未实现)

注意需要实现音频的焦点转移,不能和beatbox应用似的,快速点击时候会有很多个音频在同时响。

目前只实现了一个后台播放。

2. MediaPlayer

在这里插入图片描述

MediaPlayer 支持三种不同的媒体来源:

  1. 本地资源,(res/raw文件夹下的文件)
  2. 内部的 URI,比如可以通过 ContentResolver 来获取
  3. 外部的 URL(流) 对于Android所支持的的媒体格式列表,

除了第一种文件不需要prepare()这个操作,其余的媒体资源都需要进行prepare()。

注意一个点:

reset

public void reset ()

Resets the MediaPlayer to its uninitialized state. After calling this method, you will have to initialize it again by setting the data source and calling prepare().

reset()后需要重新的设置数据源和重新prepare()

常用 API 描述

getCurrentPosition( ):得到当前的播放位置
getDuration() :得到文件的时间
getVideoHeight() :得到视频高度
getVideoWidth() :得到视频宽度
isLooping():是否循环播放
isPlaying():是否正在播放
pause():暂停
prepare():准备(同步)
prepareAsync():准备(异步)
release():释放MediaPlayer对象
reset():重置MediaPlayer对象
seekTo(int msec):指定播放的位置(以毫秒为单位的时间)
setAudioStreamType(int streamtype):指定流媒体的类型
setDisplay(SurfaceHolder sh):设置用SurfaceHolder来显示多媒体
setLooping(boolean looping):设置是否循环播放
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener): 网络流媒体的缓冲监听
setOnCompletionListener(MediaPlayer.OnCompletionListener listener): 网络流媒体播放结束监听
setOnErrorListener(MediaPlayer.OnErrorListener listener): 设置错误信息监听
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener): 视频尺寸监听
setScreenOnWhilePlaying(boolean screenOn):设置是否使用SurfaceHolder显示
setVolume(float leftVolume, float rightVolume):设置音量
start():开始播放
stop():停止播放

3. 播放音频

(1)res/raw目录下的文件

播放作为本地原始资源(保存在应用的 res/raw/ 目录中)提供的音频:

MediaPlayer mediaPlayer =MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start();// no need to call prepare(); create() does that for you

“原始”资源是指系统不会尝试以任何特定方式解析的文件。不过,该资源的内容不应为原始音频。它应该是采用某种支持的格式且经过适当编码和格式化的媒体文件。

(2)内部 URI

更改MediaPlayerAudioService.java文件中的30行

这里的文件地址可以用adb shell来获取,进入到相关的文件夹下,pwd

mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
File file = new File("//sdcard/Music/fly.mp3");
mPlayer.setDataSource(getApplicationContext(), Uri.parse(file.getAbsolutePath()));
mPlayer.prepare(); // might take long! (for buffering, etc)

(3)外部网址(流式传输)

4. 利用服务后台播放音乐

(1)利用startService

(2)利用binderService

binderService要比startService好一些,我们可以在binder中去实现定制的功能方法,同时有binder可以将调用者和service连接起来。

MediaPlayerAudioService.java

public class MediaPlayerAudioService extends Service {
    private static final String TAG = "IntentService";
    private static final String EXTRA_AUDIO_RES_ID = "android.byd.audiovedio.audio_res_id";


    private MediaPlayer mPlayer = null;
    private boolean isRelease = true;   //判断是否MediaPlayer是否释放的标志
    private int mMusicResId;


    public MediaPlayerAudioService() {
    }

    public static Intent newIntent(Context context, int musicResId) {
        Intent intent = new Intent(context, MediaPlayerAudioService.class);
        intent.putExtra(EXTRA_AUDIO_RES_ID, musicResId);
        return intent;
    }

    //定义onBinder方法所返回的对象
    public class MyBinder extends Binder {
        // 设置歌曲ResId
        public void setResId(int resId) {
            mMusicResId = resId;
        }

        // 播放
        public void play(){
            if (isRelease) {
                mPlayer = MediaPlayer.create(getApplicationContext(), mMusicResId);
                isRelease = false;
            }
            mPlayer.start();   //开始播放
        }

        // 暂停
        public void pause(){
            mPlayer.pause();     //暂停播放
        }

        // 停止
        public void stop(){
            mPlayer.reset();     //重置MediaPlayer
            mPlayer.release();   //释放MediaPlayer
            isRelease = true;
        }
    }
    private MyBinder mBinder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.i(TAG, "onBind方法被调用!");
        mMusicResId = intent.getIntExtra(EXTRA_AUDIO_RES_ID, 0);
        return mBinder;
    }

    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate方法被调用!");
        super.onCreate();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG, "onUnbind方法被调用!");
        return true;
    }

    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy方法被调用!");
        super.onDestroy();
    }

    @Override
    public void onRebind(Intent intent) {
        Log.i(TAG, "onRebind方法被调用!");
        super.onRebind(intent);
    }
}

MediaPlayerAudioActivity.java

public class MediaPlayerAudioActivity extends AppCompatActivity implements View.OnClickListener{

    private Button mStartButton;
    private Button mPauseButton;
    private Button mStopButton;

    public static Intent newIntent(Context packageContext) {
        Intent intent = new Intent(packageContext, MediaPlayerAudioActivity.class);
        return intent;
    }

    //保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象
    private MediaPlayerAudioService.MyBinder mBinder;
    private ServiceConnection conn = new ServiceConnection() {

        //Activity与Service断开连接时回调该方法
        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("------Service DisConnected-------");
        }

        // Activity与Service连接成功时回调该方法
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("------Service Connected-------");
            mBinder = (MediaPlayerAudioService.MyBinder) service;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_player_audio);

        mStartButton = (Button) findViewById(R.id.btn_media_player_audio_start);
        mPauseButton = (Button) findViewById(R.id.btn_media_player_audio_pause);
        mStopButton = (Button) findViewById(R.id.btn_media_player_audio_stop);

        Intent intentService = MediaPlayerAudioService.newIntent(this, R.raw.fly);
        // 绑定服务
        bindService(intentService, conn, Service.BIND_AUTO_CREATE);

        mStartButton.setOnClickListener(this);
        mPauseButton.setOnClickListener(this);
        mStopButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_media_player_audio_start:
                mBinder.play();
                mStartButton.setEnabled(false);
                mPauseButton.setEnabled(true);
                mStopButton.setEnabled(true);
                break;
            case R.id.btn_media_player_audio_pause:
                mBinder.pause();
                mStartButton.setEnabled(true);
                mPauseButton.setEnabled(false);
                mStopButton.setEnabled(false);
                break;
            case R.id.btn_media_player_audio_stop:
                mBinder.stop();
                // stop() 之后如果想再次播放,就得再次prepare()
                mStartButton.setEnabled(true);
                mPauseButton.setEnabled(false);
                mStopButton.setEnabled(false);
                break;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值