前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android MediaPlayer 播放音频

Android MediaPlayer 播放音频

作者头像
AnRFDev
发布于 2021-02-01 07:21:01
发布于 2021-02-01 07:21:01
2.4K00
代码可运行
举报
文章被收录于专栏:AnRFDevAnRFDev
运行总次数:0
代码可运行

本文链接: Android MediaPlayer 播放音频

主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介

为了方便表达,定义变量名为mediaPlayer。

MediaPlayer的使用方式

创建MediaPlayer

可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer = new MediaPlayer();

使用create方法创建成功后,mediaPlayer处于Prepared状态。可以直接start播放。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));
mediaPlayer.start();

设置音源 - setDataSource

通过调用setDataSource来设置音源。setDataSource有多个重载方法,我们来看常用的几种。

例如设置使用assets里的资源。实际情况可能需要try catch。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

本地文件,需要文件的绝对路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.setDataSource(file.getAbsolutePath());

或者获取文件的Uri来创建mediaPlayer。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

设置网络音频,也是用setDataSource方法,设置url。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

播放网络音频时,如果使用的是http,有可能会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

可以简单地设置一下manifest,设置usesCleartextTraffic=”true”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<application
        android:usesCleartextTraffic="true">

准备 - prepare

同步和异步准备音频资源。prepareAsync()是异步的方式,prepare是同步的。注意线程调度问题,同时不要阻塞UI线程。

使用异步方式准备音频,经常与MediaPlayer.OnPreparedListener监听器配合使用。异步准备时,也可以进行其他的设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mediaPlayer.start(); // 准备好了就播放
    }
});

循环播放 - Looping

设置循环播放setLooping。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.setLooping(true);

播放完毕后,不会回调OnCompletionListener,而是从头播放当前音频。

播放 - start

播放音频,调用start方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.start();

处于Prepared,Pause和PlaybackComplete状态时,可以调用start方法,进入Started状态。

暂停 - pause

暂停播放,使用pause方法。在暂停前先判断一下mediaPlayer的是否在播放。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

暂停成功则处于Paused状态。

停止 - stop

回顾一下MediaPlayer状态切换的图示,我们可以得知在播放中,暂停,播放完成这3个状态下,可以调用stop方法,进入Stopped状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.stop();

调进度 - seekTo

调整播放进度。我们平时使用音乐播放软件一般都会有这个功能。

seekTo方法接受一个毫秒参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

seekTo并不会改变MediaPlayer的状态。

重置 - reset

reset后的mediaPlayer进入Idle状态。需要重新设置音源与准备。

释放 - release

不再使用这个mediaPlayer时,应当尽快释放掉,以释放相关的资源。

调用release后,mediaPlayer进入End状态。此时这个mediaPlayer就不能再使用了。

常用监听器

缓冲监听器 OnBufferingUpdateListener

比如我们加载网络音频的时候,常用这个监听器来监听缓冲进度。显示缓冲进度,也可以提高用户体验。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // percent代表缓冲百分比
    }
});

错误监听器 OnErrorListener

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        return true; // 返回true表示在此处理错误,不会回调onCompletion
    }
});

注意onError的返回值。可以选择自己处理error。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * @return True if the method handled the error, false if it didn't.
 * Returning false, or not having an OnErrorListener at all, will
 * cause the OnCompletionListener to be called.
 */
boolean onError(MediaPlayer mp, int what, int extra);

播放完毕监听器 OnCompletionListener

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        // 播放完毕
    }
});

使用示例

播放assets里的音频

播放assets里的音频文件,使用到AssetFileDescriptor类。使用后记得关闭AssetFileDescriptor。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void playAssetsAudio(final String name, Context context) {
    Log.d(TAG, "playAssetWordSound: try to play assets sound file. -> " + name);
    AssetFileDescriptor fd = null;
    try {
        MediaPlayer mediaPlayer;
        Log.v(TAG, "Looking in assets.");
        fd = context.getApplicationContext().getAssets().openFd(name);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.reset();
        mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.d(TAG, "onPrepared: " + name);
                mediaPlayer.start();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
                Log.d(TAG, "onCompletion: " + name);
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int i, int i1) {
                mp.release();
                return true;
            }
        });
    } catch (Exception e) {
        try {
            if (fd != null) {
                fd.close();
            }
        } catch (Exception e1) {
            Log.e(TAG, "Exception close fd: ", e1);
        }
    } finally {
        if (fd != null) {
            try {
                fd.close();
            } catch (IOException e) {
                Log.e(TAG, "Finally, close fd ", e);
            }
        }
    }
}

播放本地音频文件

尝试播放音频文件。仅播放一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void playAudioFile(final File file) {
    Log.d(TAG, "playAudioFile: " + file.getAbsolutePath());
    MediaPlayer mediaPlayer;
    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setLooping(false);
        mediaPlayer.setDataSource(file.getAbsolutePath());
        mediaPlayer.prepare();
        mediaPlayer.start();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                Log.d(TAG, "Play local sound onError: " + i + ", " + i1);
                return true;
            }
        });
    } catch (Exception e) {
        Log.e(TAG, "playAudioFile: ", e);
    }
}

播放在线音频

设置url,播放在线音频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void playOnlineSound(String soundUrlDict) {
    try {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(soundUrlDict);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (mp != null) {
                    mp.release();
                }
                Log.d(TAG, "onCompletion: play sound.");
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                Log.d(TAG, "Play online sound onError: " + i + ", " + i1);
                return false;
            }
        });
    } catch (IOException e1) {
        Log.e(TAG, "url: ", e1);
    }
}

代码可以参考示例工程: https://github.com/RustFisher/android-MediaPlayer

更多参考:

Android MediaPlayer 基础简介

Android MediaPlayer 播放音频

Android 使用URLConnection下载音频文件

Android MediaPlayer 音频倍速播放,调整播放速度

Android音视频相关文章请参考 https://rustfisher.com/tags/Android-Media/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
​17 款程序员神级 Chrome 插件,爱了爱了!
下载链接:https://www.chajianxw.com/themes/18893.html
dys
2021/12/09
7900
​17 款程序员神级 Chrome 插件,爱了爱了!
珍藏版Chrome插件送给你们,不仅是程序员必备
大家好,消失了几天我又满血复活归来了,最近这几天太忙了一直在加班工作,这不昨天又干到凌晨一点,今天早上七点就起来了,到现在还都没有休息,现在只剩半血了,不对应该说现在只能爬着走了,但是一想到几天没有更新文章了,还是强忍着上来更新,证明我还行。
六小登登
2019/02/25
5380
珍藏版Chrome插件送给你们,不仅是程序员必备
用好这 42 款 Chrome 插件,每年轻松省出一个年假(附下载)
相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多强大好用的扩展程序(Extensions)。
数据派THU
2019/09/17
19.6K0
用好这 42 款 Chrome 插件,每年轻松省出一个年假(附下载)
没有这 29 款插件的 Chrome 是没有灵魂的
相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多强大好用的扩展程序(Extensions)。
会呼吸的Coder
2020/09/21
6700
没有这 29 款插件的 Chrome 是没有灵魂的
强烈推荐 10 款珍藏的 Chrome 浏览器插件
Firebug 的年代,我是火狐(Mozilla Firefox)浏览器的死忠;但后来不知道为什么,该插件停止了开发,导致我不得不寻求一个新的网页开发工具。那段时间,不少人开始推荐 Chrome 浏览器,我想那就试试吧,期初我觉得用起来很别扭,毕竟我不是一个“喜新厌旧”的人。但用的次数越来越多,也就习惯了。
沉默王二
2020/02/20
8590
有哪些实用且堪称神器的Chrome插件?吐血推荐!!!
相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多强大好用的扩展程序(Extensions)。 最近为了更好的利用谷歌浏览器,我整理了一些常用的谷歌插件,分享给大家。
谭庆波
2018/08/10
9.6K0
有哪些实用且堪称神器的Chrome插件?吐血推荐!!!
程序员必知的Chrome浏览器灵魂插件
优势之一在于流畅度,其二就是兼容性很强,这也是它最大的优势:支持众多强大好用的拓展程序(Extensions)。
老九君
2020/10/30
9110
程序员必知的Chrome浏览器灵魂插件
这么香的Chrome插件,你都安装了吗?
工欲善其事必先利其器,今天长话短说,介绍13个敏捷、高效的Chrome插件 根据使用方式,本人将其划分为三大类:
有态度的马甲
2020/04/16
2K1
这么香的Chrome插件,你都安装了吗?
Chrome 插件
我是一个重度的 Chrome 使用者,还是给大家带来一波好用的 Chrome 插件吧,都是我自己亲身使用过觉得不错的,推荐给大家。
CoderStar
2022/08/24
1.6K0
Chrome 插件
你值得安装的24个chrome插件!!!
chrome可能是程序员最喜欢用的浏览器之一了,它画面简洁,兼容性好,易于调试程序,更重要的是提供了丰富的插件。
Java技术编程
2020/06/04
7.6K0
你值得安装的24个chrome插件!!!
珍藏版Chrome插件送给你们,不仅是程序员必备
大家好,消失了几天我又满血复活归来了,最近这几天太忙了一直在加班工作,这不昨天又干到凌晨一点,今天早上七点就起来了,到现在还都没有休息,现在只剩半血了,不对应该说现在只能爬着走了,但是一想到几天没有更新文章了,还是强忍着上来更新,证明我还行。
六小登登
2018/11/15
4830
极力推荐的Chrome插件!
Momentum能给单调的Chorme首页披上一个漂亮的风景照,毕竟谷歌浏览器的页面打开是这样的。
昱良
2018/07/31
9051
极力推荐的Chrome插件!
倚天屠龙荐:Chrome插件推荐
给大家推荐几款比较好用chrome插件,包括日常应用功能以及安全测试用途的,大家各取所需。
泉哥
2019/07/18
7230
倚天屠龙荐:Chrome插件推荐
开发人员常用工具最全锦集(持续更新)
工欲善其事必先利其器,利用好一系列优秀的工具,来提高自己的工作效率,高质高产才能腾出更多的时间愉快的玩耍;今天把积攒了多年的压箱底儿搬出来分享给各位;
一行Java
2022/04/06
1.1K0
开发人员常用工具最全锦集(持续更新)
Chrome浏览器必备插件推荐
Chrome浏览器对于我们现在互联网行业已经不可或缺,其实大部分使用Chrome浏览器的人更看重的是它的强大的插件功能,几乎提供的插件无所不能。
浅羽技术
2022/03/18
2.1K0
Chrome浏览器必备插件推荐
CSDN Chrome插件来了。助开发者提升开发效率,远离996
这个输入框就是插件的主要入口了,所有功能都从这里触发 使用mac的同学应该比较熟悉,参考了mac的聚焦搜索
全栈程序员站长
2022/07/23
5270
CSDN Chrome插件来了。助开发者提升开发效率,远离996
把Safari当chrome用(插件篇)
主页:http://markdown-here.com 点评:在网页的编辑器中用markdown的语法输入内容,然后右击选择Markdown Toggle或者按下markdown here插件的图标或者按下快捷键CTRL+ALT+M即可完成渲染,让你轻松搞定内容排版。 更多设置,请参考:利用 Markdown Here 实现高效排版
尾尾部落
2018/09/04
2.6K0
把Safari当chrome用(插件篇)
程序猿的 Chrome 浏览器插件推荐
这是一款标签页插件,我使用 Chrome 浏览器的时候就开始使用这个插件,注册后可以使用 Pro 版本,它具有多种搜索引擎设计及类似书签页的功能,非常的实用,可以看一下我之前写的介绍 Infinity 插件的文章:
Meng小羽
2020/03/18
1.3K0
极大提高工作效率的几十种神兵利器
来源:https://www.liutf.com/posts/3720794851.html
程序猿DD
2018/07/31
1.6K0
极大提高工作效率的几十种神兵利器
2021 年值得推荐的 14 款 Chrome 开发者插件
使用它你可以使用到许多不同的 Web 开发工具。一些最常用的包括快速清除会话 Cookie、显示元素信息、显示图像文件大小、显示地形信息和编辑 CSS。
ConardLi
2021/09/08
3.1K0
2021 年值得推荐的 14 款 Chrome 开发者插件
推荐阅读
相关推荐
​17 款程序员神级 Chrome 插件,爱了爱了!
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • MediaPlayer的使用方式
    • 创建MediaPlayer
    • 设置音源 - setDataSource
    • 准备 - prepare
    • 循环播放 - Looping
    • 播放 - start
    • 暂停 - pause
    • 停止 - stop
    • 调进度 - seekTo
    • 重置 - reset
    • 释放 - release
  • 常用监听器
    • 缓冲监听器 OnBufferingUpdateListener
    • 错误监听器 OnErrorListener
    • 播放完毕监听器 OnCompletionListener
  • 使用示例
    • 播放assets里的音频
    • 播放本地音频文件
    • 播放在线音频
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档