MediaPlayer是Android当中开发音视频应用的一个重要组件,它不仅支持本地音视频的播放,同时也能够播放网络的音视频,支持多种音视频播放格式。这里学习使用MediaPlayer播放SD卡中的音频文件。
按照Android第一行代码第二版的8.4敲了一遍,由于这本书是基于Android7写的,因此SD卡读取权限申请部分不适用Android10及以上版本了。因此网上查了一下,将代码调通了。
首先manifest文件需要追加SD卡读的权限,如下图:
onCreate部分定义3个button,然后调用verifyStoragePermissions用于申请SD卡读取权限。然后调用initMediaPlayer初始化MediaPlayer。
在onDestroy函数中stop和release mediaPlayer,在verifyStoragePermissions函数中申请权限,如果只播放SD卡目录的歌曲申请个读权限就可以了,我也把写申请了。
在initMediaPlayer中初期化Media,包括创建MediaPlayer,指定MediaPlay播放文件路径等。
在onRequestPermissionsResult函数中判断如果用户拒绝了权限就弹出Toast提示用户,这个函数可以不写,不影响音乐播放。
最后在onClick中根据不同的按键调用mediaPlayer的函数进行播放、暂停(再次播放继续播放)、和停止(再次播放从头播放)。
在虚拟机上运行需要打开虚拟机的Device File Explorer,将music1.mp3放到sdcard/Music目录下。直接拖拽文件就放到目录下就行。
注意:
你用哪个虚拟机就需要在哪个虚拟机的Device File Explorer中sdcard/Music目录下添加明为music1.mp3的音乐文件。
加入音频文件后将虚拟机重启一下。点击Device Manager,选择虚拟机右侧的竖着的三个点,然后再选择Cold Boot Now就可以了。
运行一下程序,就可以听到美妙动听的音乐了。
最后介绍一下MediaPlayer常用的方法:
方法 | 描述 |
---|---|
getCurrentPosition( ) | 得到当前的播放位置 |
getDuration() | 得到文件的时间 |
getVideoHeight() | 得到视频高度 |
getVideoWidth() | 得到视频宽度 |
isLooping() | 是否循环播放 |
isPlaying() | 是否正在播放 |
pause() | 暂停 |
prepare() | 准备(同步) |
prepareAsync() | 准备(异步) |
release() | 释放MediaPlayer对象 |
reset() | 重置MediaPlayer对象 |
seekTo(int msec) | 指定播放的位置(以毫秒为单位的时间) |
setDataSource(String path) setDataSource(FileDescriptor fd) | 设置数据源 |
setAudioStreamType(int streamtype) | 指定流媒体的类型 |
setDisplay(SurfaceHolder sh) | 设置用SurfaceHolder来显示多媒体 |
setLooping(boolean looping) | 设置是否循环播放 |
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) | 网络流媒体的缓冲监听 |
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) | 网络流媒体播放结束监听 |
setOnErrorListener(MediaPlayer.OnErrorListener listener) | 设置错误信息监听 |
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) | 视频尺寸监听 |
setScreenOnWhilePlaying(boolean screenOn) | 设置是否使用SurfaceHolder显示 |
setVolume(float leftVolume, float rightVolume) | 设置音量 |
start() | 开始播放 |
stop() | 停止播放 |
Domo代码: