MediaPlayer播放音频

MediaPlayer提供的常用方法

方法 说明
MediaPlayer 构造方法
create 创建一个要播放的多媒体
getCurrentPosition 得到当前播放位置
getDuration 得到文件的时间
getVideoHeight 得到视频的高度
getVideoWidth 得到视频的宽度
isLooping 是否循环播放
isPlaying 是否正在播放
pause 暂停
prepare 准备(同步)
prepareAsync 准备(异步)
release 释放MediaPlayer对象相关的资源
reset 重置MediaPlayer对象为刚刚创建的状态
seekTo 指定播放的位置(以毫秒为单位的时间)
setAudioStreamType 设置流媒体的类型
setDataSource 设置多媒体数据来源(位置)
setDisplay 设置用SurfaceHolder来显示多媒体
setLooping 设置是否循环播放
setOnButteringUpdateListener 网络流媒体的缓冲监听
setOnErrorListener 设置错误信息监听
setOnVideoSizeChangedListener 视频尺寸监听
setScreenOnWhilePlaying 设置是否使用SurfaceHolder来保持屏幕显示
setVolume 设置音量
start 开始播放
stop 停止播放

如何获得MediaPlayer实例

方法一、create的方式

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

方法二、直接new的方式

MediaPlayer mp = new MediaPlayer();

这两种方式分别对应 栗子1 和 栗子2。

如何设置要播放的文件

1、 用户在应用中事先自带的 resource 资源

mp.create(this, R.raw.test);

2、存储在SD卡或其他文件路径下的媒体文件

mp.setDataSource("/sdcard/test.mp3");

3、网络上的媒体文件

mp.setDataSource("https://music.taihe.com/song/T10057218352");

栗子1

在这里插入图片描述
布局代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">

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

    <Button
        android:id="@+id/pause"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Pause" />

    <Button
        android:id="@+id/stop"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="stop" />
</LinearLayout>

java代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button play;
    private Button pause;
    private Button stop;
    private MediaPlayer mediaPlayer;

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

        play = (Button) findViewById(R.id.play);
        pause = (Button) findViewById(R.id.pause);
        stop = (Button) findViewById(R.id.stop);

        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);

        initMediaPlayer();
    }

    private void initMediaPlayer() {
        try {
            mediaPlayer = MediaPlayer.create(this, R.raw.test);
            mediaPlayer.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.play:
                if (!mediaPlayer.isPlaying()) {
                    mediaPlayer.start(); // 开始播放
                }
                break;
            case R.id.pause:
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.pause(); // 暂时播放
                }
                break;
            case R.id.stop:
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.reset(); // 停止播放
                    initMediaPlayer();
                }
                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}

其中R.raw.test是 res 下的一个mp3文件,需自己创建

这里写图片描述

栗子2

布局 和 java 代码相同,更改 MediaPlayer 获取实例代码 和 initMediaPlayer() 方法

private MediaPlayer mediaPlayer = new MediaPlayer();

private void initMediaPlayer() {
        try {
            String path = Environment.getExternalStoragePublicDirectory
                    (Environment.DIRECTORY_MUSIC) + File.separator;//sd根目录
            final File file = new File(path, "周杰伦 - 三年二班.mp3");
            mediaPlayer.setDataSource(file.getAbsolutePath()); // 指定音频文件的路径
            mediaPlayer.prepare(); // 让MediaPlayer进入到准备状态
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

AndroidManifest.xml 增加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

播放在线音乐

修改initMediaPlayer()方法。把 setDataSource 改成一个可以播放的网络音乐地址。

private void initMediaPlayer() {
        try {
        mediaPlayer.setDataSource("http://down010702.tingclass.com/lesson/shi0529/0009/9804/Ellie-Goulding-I'll-Hold-My-Breath.mp3"); // 指定音频文件的路径
            mediaPlayer.prepareAsync(); // 让MediaPlayer进入到准备状态
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

AndroidManifest.xml 中需要增加 网络权限

<uses-permission android:name="android.permission.INTERNET" />

如果网络歌曲的地址是 http开头的可能会报错java.io.IOException: Cleartext HTTP traffic to xx.com not permitted,所以需要在 AndroidManifest.xml 的 application 节点增加

<application
       	......
        android:usesCleartextTraffic="true" >

MediaPlayer: start called in state 0报错处理

点击播放按钮播放不了,且输出如下错误:
在这里插入图片描述

解决办法:

1、检查AndroidManifest.xml 是否增加了以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2、手机权限管理中是否开启了权限管理
在这里插入图片描述

java.io.IOException: Cleartext HTTP traffic to xx.com not permitted 报错处理

如果网络歌曲的地址是 http开头的可能会报错java.io.IOException: Cleartext HTTP traffic to xx.com not permitted,所以需要在 AndroidManifest.xml 的 application 节点增加

<application
       	......
        android:usesCleartextTraffic="true" >

Unable to create media player报错处理

在播放网络歌曲时,是需要访问网络的,所以需要在 AndroidManifest.xml 中增加网络权限,如果没有加会报这个错

<uses-permission android:name="android.permission.INTERNET" />

MediaPlayer:Error(1,xxx) 报错处理

在这里插入图片描述
如果网络歌曲的地址不正确可能会出现这个问题,所以检查网络歌曲链接。正确的链接应该是在浏览器打开后可以直接播放的:在这里插入图片描述

参考
Android MediaPlayer 播放音频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值