本文档介绍了在使用 Media Player 之前您应该熟悉的基本概念。
声音和视频类
以下类在 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,例如您可能从 Content Resolver 获取的 URI
- 外部 URL(流式传输)
如需了解 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(例如通过 Content Resolver 获取的 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 流式传输从远程 URL 播放的方法如下所示:
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 是您应用中媒体播放的推荐解决方案。您可以在此处了解更多信息。
这些页面涵盖了与音频和视频录制、存储和播放相关的主题: