Android MediaPlayer

1 MediaPlayer生命周期

在这里插入图片描述

2 MediaPlayer常用方法

在这里插入图片描述
MediaPlayer执行流程:

  • 创建MediaPlayer
MediaPlayer mediaPlayer = new MediaPlayer();
或
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); // 使用该方法不需要再setDataSource()和prepare()
  • 设置数据源
mediaPlayer.setDataSource(filePath);
  • 进入准备状态
mediaPlayer.prepare();
  • 开始播放
mediaPlayer.start();
  • 暂停/停止播放
mediaPlayer.pause();
mediaPlayer.stop();
  • 重置MediaPlayer
mediaPlayer.reset():
  • 释放MediaPlayer
mediaPlayer.release();

3 MediaPlayer的使用

<?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">

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

        <Button
            android:id="@+id/btn_start"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="开启" />

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

        <Button
            android:id="@+id/btn_stop"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="停止" />

    </LinearLayout>

    <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:max="0"
        android:progress="0"
        android:secondaryProgress="0" />

</LinearLayout>



/**
 * 1、MediaPlayer创建的两种方式
 * (1)MediaPlayer mediaPlayer = new MediaPlayer();
 * (2)MediaPlayer mediaPlayer = MediaPlayer.create(context, source);
 * 使用第二种方法创建MediaPlayer不用再调用setDataSource()设置数据源
 *
 * 2、设置数据源的三种方式
 * (1)在resource资源获取数据源:
 * MediaPlayer.create(this, R.raw.test);
 * (2)在sd卡或文件路径获取数据源:
 * MediaPlayer.setDataSource("/sdcard/test.mp3");
 * (3)网络数据源:
 * MediaPlayer.setDataSource("http://www.test.com/test.mp3");
 *
 * 3、MediaPlayer的setDataSource()一共有四个方法:
 * [1]setDataSource(String path)
 * [2]setDataSource(FileDescriptor fd)
 * [3]setDataSource(Context context, Uri uri)
 * [4]setDataSource(FileDescriptor fd, long offset, long length)
 *
 * 其中,使用FileDescriptor时,需要将文件放到与res目录平级的assets目录,通过以下方式访问:
 * AssetFileDescriptor fd = getAssets().openFd("test.mp3");
 * MediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
 */

public class MediaPlayerActivity extends AppCompatActivity {

    private SeekBar mSeekBar;
    private MediaPlayer mMediaPlayer;

    private static Handler sHandler = new Handler();
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());

            sHandler.postDelayed(this, 1000);
        }
    };

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

        initViews();
        initMediaPlayer();
        initMediaData();

        // 开启
        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mMediaPlayer != null) {
                    if (mMediaPlayer.isPlaying()) {
                        return;
                    }
                } else {
                    initMediaPlayer();
                }
                mMediaPlayer.start();
                sHandler.postDelayed(mRunnable, 1000);
            }
        });

        // 暂停
        findViewById(R.id.btn_pause).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                }
            }
        });

        // 停止
        findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.stop();
                    mMediaPlayer.reset();
                    mMediaPlayer = null;
                }
            }
        });

        // 播放进度监听
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mMediaPlayer != null) {
                    mMediaPlayer.seekTo(mSeekBar.getProgress());
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    private void initViews() {
        mSeekBar = findViewById(R.id.seekbar);
    }

    private void initMediaPlayer() {
        // 播放会有卡顿,不流畅
        try {
            AssetFileDescriptor afd = getAssets().openFd("heavy.mp3");
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mMediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
	
	// res/raw
//	mMediaPlayer = MediaPlayer.create(this, R.raw.heavy);
    }

    private void initMediaData() {
        mSeekBar.setMax(mMediaPlayer.getDuration());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        sHandler.removeCallbacks(mRunnable);
        // 释放资源
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值