MediaPlayer的使用

MediaPlayer的使用

简介:Android应用程序中的音频和视频的播放通常有MediaPlayer类进行处理。使用MediaPlayer,能播放存储在应用程序资源、本地文件、ContentProvider、网络URL的流式传输中的媒体。

MediaPlaye对音频和视频文件以及数据流的管理是作为一个状态机来处理的。状态机详细资料,点击这里跳转简单来说,就是:

  1. 对将要播放媒体的MediaPlayer进行初始化;
  2. 使MediaPlayer进入准备状态;
  3. 开始播放;
  4. 在播放完成之前暂停或停止播放;
  5. 播放完成。

一、播放音频

以下是MediaPlayer中一些常用的方法:

示例:播放assetes文件夹下的音频资源,可以暂停/播放、随机切换、与SeekBar控件建立关联。

效果:

1.1 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:background="#1E95D6"
        android:gravity="center"
        android:padding="10dp"
        android:text="音频播放器"
        android:textColor="#FFFFFF"
        android:textSize="20sp" />


    <TextView
        android:id="@+id/audio_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="音频文件名"
        android:textSize="16sp"
        android:gravity="center"/>

    <TextView
        android:id="@+id/audio_singer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="歌手"
        android:padding="10dp"
        android:textSize="14sp"
        android:gravity="center"/>

    <LinearLayout
        android:id="@+id/lin_Media"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/time_current"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="0:0" />

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="5" />

        <TextView
            android:id="@+id/time_sum"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="0:0" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/play"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:text="暂停" />

        <Button
            android:id="@+id/random"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:text="随机切换" />
    </LinearLayout>

</LinearLayout>

2.2 资源文件

2.3 代码

public class MediaMusicActivity extends Activity {

    @BindView(R.id.audio_title)
    TextView audioTitle;
    @BindView(R.id.audio_singer)
    TextView audioSinger;
    @BindView(R.id.time_current)
    TextView timeCurrent;
    @BindView(R.id.seekBar)
    SeekBar seekBar;
    @BindView(R.id.time_sum)
    TextView timeSum;
    @BindView(R.id.play)
    Button btnPlay;

    private Context mContext = MediaMusicActivity.this;
    private static MediaPlayer mMusicMediaPlayer;

    private Timer mTimer = new Timer();
    private int toProgress;
    private int currentMusic;

    private String[] arrMusicName = new String[]{"Stay With Me(中文版)", " Numb", "Apologize"};
    private String[] arrMusicSinger = new String[]{"Jason Chen", "Linkin Park", "Kris Allen"};
    private String[] arrMusicUri = new String[]{"_001.mp3", "_002.mp3", "_003.mp3"};

    private final static int UPDATE = 01001;//更新

    private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
        case UPDATE:
            timeCurrent.setText(getTime(mMusicMediaPlayer.getCurrentPosition()));
            seekBar.setProgress(mMusicMediaPlayer.getCurrentPosition());
            break;
        }
    }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_music);
        ButterKnife.bind(this);

        currentMusic = randomGenerator(0, arrMusicUri.length);
        initMediaPlayer(mContext);


        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
            handler.sendEmptyMessage(UPDATE);
            }
        },0,1000);

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                timeCurrent.setText(getTime(progress));
                toProgress = progress;

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mMusicMediaPlayer.seekTo(toProgress);
                mMusicMediaPlayer.start();
            }
        });

 }


    @OnClick({R.id.play, R.id.random})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.play:
                if(mMusicMediaPlayer.isPlaying()){
                    mMusicMediaPlayer.pause();
                    btnPlay.setText("播放");
                }else {
                    mMusicMediaPlayer.start();
                    btnPlay.setText("暂停");
                }
                break;
            case R.id.random:
                initMediaPlayer(mContext);
                break;
        }
    }


    /**
     * 创建MediaPlayer对象,并设置数据源
     */
    private void initMediaPlayer(Context context) {
        int intRandom = randomMusic();
        if (mMusicMediaPlayer == null) {
            mMusicMediaPlayer = new MediaPlayer();
        }
        mMusicMediaPlayer.reset(); // 强制重置(针对非第一次播放)
        AssetManager assetManager = context.getAssets();
        try {
            AssetFileDescriptor fileDescriptor = assetManager.openFd(arrMusicUri[intRandom]);
            mMusicMediaPlayer
                .setDataSource(fileDescriptor.getFileDescriptor(),
                    fileDescriptor.getStartOffset(),
                    fileDescriptor.getLength());
            mMusicMediaPlayer.prepare();
            mMusicMediaPlayer.start();//播放
            updateViews(intRandom);//更新UI
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 随机切换(生成一个与当前值不同的随机数)
     * @return
     */
    private int randomMusic(){
        int intRandom = randomGenerator(0, arrMusicUri.length);
        while (intRandom == currentMusic){
            intRandom = randomGenerator(0, arrMusicUri.length);
        }
           return intRandom;
    }

    /**
     * 重置播放器后更新UI
     * @param position
     */
    private void updateViews(int position) {
        audioTitle.setText(arrMusicName[position]);
        audioSinger.setText(arrMusicSinger[position]);
        timeSum.setText(getTime(mMusicMediaPlayer.getDuration()));
        seekBar.setMax(mMusicMediaPlayer.getDuration());
        seekBar.setProgress(0);
        btnPlay.setText("暂停");
        currentMusic = position;
    }

    /**
     * 生成指定范围的随机数[min,max)
     *
     * @param min
     * @param max
     * @return
     */
    private int randomGenerator(int min, int max) {
        return new Random().nextInt(max) % (max - min + 1) + min;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMusicMediaPlayer != null) {
            mMusicMediaPlayer.stop();
        }
        if(mTimer != null){
            mTimer.cancel();
        }
    }


    /**
     * 转化时长
     * @param duration
     * @return
     */
    private String getTime(int duration) {
        int intMinute = (duration / 1000) / 60;
        int intSecond = (duration / 1000) % 60;
        String strMinute = (intMinute < 10 ? "0" + intMinute : "" + intMinute);
        String strSecond = (intSecond < 10 ? "0" + intSecond : "" + intSecond);
        return strMinute + ":" + strSecond;
    }


}

二、播放视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值