本文档介绍了您在使用媒体播放器之前应熟悉的基本概念。
声音和视频类
以下类在 Android 框架中播放声音和视频:
MediaPlayer
:此类是用于播放声音和视频的主要 API。AudioManager
:此类用于管理设备上的音频源和音频输出。
清单声明
在开始使用 MediaPlayer 开发应用之前,请确保您的清单具有适当的声明,这样才能使用相关功能。
互联网权限:如果您使用 MediaPlayer 流式播放基于网络的内容,则您的应用必须申请网络访问权限。
<uses-permission android:name="android.permission.INTERNET" />
唤醒锁定权限:如果您的播放器应用需要防止屏幕变暗或处理器进入休眠状态,或者要使用
MediaPlayer.setScreenOnWhilePlaying(boolean)
或MediaPlayer.setWakeMode(android.content.Context, int)
方法,则您必须申请此权限。<uses-permission android:name="android.permission.WAKE_LOCK" />
使用 MediaPlayer 类
MediaPlayer
类是媒体框架的重要组成部分。此类的对象能够获取、解码以及播放音频和视频,而且只需极少量设置。MediaPlayer
支持多种媒体源,包括:
- 本地资源
- 内部 URI,例如您可能从内容解析器那获取的 URI
- 外部网址(流式传输)
如需了解 Android 支持的媒体格式列表,请参阅支持的媒体格式页面。
使用音频源的示例
以下示例展示了如何播放作为本地原始资源(保存在应用的 res/raw/
目录中)提供的音频:
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
在本例中,“原始”资源是指系统不会尝试以任何特定方式解析的文件。不过,该资源的内容不应为原始音频。它应该是采用某种支持的格式且经过适当编码和格式化的媒体文件。
播放系统中本地可用的 URI(例如,您可以通过内容解析器获取)中的内容方法如下:
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Java
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
使用 HTTP 流式传输并播放远程网址上的内容如下所示:
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Java
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
使用异步准备提高性能
使用 MediaPlayer
时,请注意性能。例如,对 prepare()
的调用可能需要很长时间来执行,因为它可能涉及获取和解码媒体数据。因此,与任何可能需要很长时间来执行的方法一样,切勿从应用的界面线程中调用它。这样做会导致界面停止响应,直到该方法返回,这是一种糟糕的用户体验,并且可能会导致 ANR(应用无响应)错误。
为避免界面线程挂起,请生成其他线程来准备 MediaPlayer
,并在准备工作完成后通知主线程。该框架提供了一种便捷的方法来实现 prepareAsync()
方法来执行此任务。此方法会在后台开始准备媒体,并立即返回。当媒体准备就绪后,系统会调用通过 setOnPreparedListener()
配置的 MediaPlayer.OnPreparedListener
的 onPrepared()
方法。
了解详情
Jetpack Media3 是应用中播放媒体的推荐解决方案。详细了解。
以下页面介绍了有关录制、存储以及播放音频和视频的主题: