android mediaplayer 权限,Android — 使用MediaPlayer进行音频播放
上一篇说到音频录制的时候我就知道肯定会有音频播放这个功能,果不其然后续播放的需求又给我加上了,因为之前是AMR格式,所以这里使用MediaPlayer进行播放,据ios说播放amr格式的音频还挺麻烦的。
一、添加必要权限
//有播放网络资源的需要添加网络权限。
//播放本地资源需要添加SD卡权限,一般存储我都会全加上。
//在播放时有特殊设置的需要声明一个相应的WAKE_LOCK权限
二、MediaPlayer 介绍
1.状态图
音频/视频文件和流的播放控制作为状态机进行管理。下图显示了受支持的播放控制操作驱动的 MediaPlayer 对象的生命周期和状态。椭圆形表示 MediaPlayer 对象可能驻留的状态。弧形表示驱动对象状态转换的回放控制操作。有两种类型的弧。具有单箭头的弧表示同步方法调用,而具有双箭头的弧表示异步方法调用。
MediaPlayer状态图
具体信息可以去Android官网阅读
2.MediaPlayer公开方法
方法有很多,这里只说常用的几个方法,其他的去Android官网查阅。
公开方法
static MediaPlayer
create(Context context, int resid )为给定资源ID创建MediaPlayer的便捷方法,一般播放Raw下资源会使用此方法。
void
setDataSource (AssetFileDescriptor afd)
setDataSource (FileDescriptor fd)
setDataSource (String path)
setDataSource (MediaDataSource dataSource)
setDataSource (Context context, Uri uri)
设置数据源,这里可以设置 AssetFileDescriptor 、 FileDescriptor 、 文件路径或http / rtsp URL 、 MediaDataSource 、 Uri
void
prepare()
同步准备播放器以进行播放。
void
prepareAsync()
准备播放器异步播放。
void
pause()
暂停播放。
void
release()
释放与此MediaPlayer对象关联的资源。
void
reset()
将MediaPlayer重置为其未初始化状态。
void
start()
开始或继续播放。
void
stop()
开始或暂停播放后停止播放。
void
setVolume(float leftVolume, float rightVolume)
设置播放的音量,左右声道取值 0~1。
void
setOnCompletionListener(MediaPlayer. OnCompletionListener listener)
播放完成后的回调。
void
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
网络流缓冲区的状态更改时的回调。
void
setOnErrorListener(MediaPlayer.OnErrorListener listener)
错误回调。
void
setOnInfoListener(MediaPlayer.OnInfoListener listener)
注册一个在信息/警告可用时要调用的回调。
void
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)
注册当媒体源准备好播放时要调用的回调。
void
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)
指定播放位置后的回调。
boolean
isLooping()
检查MediaPlayer是循环还是非循环。
boolean
isPlaying()
检查MediaPlayer是否正在播放。
void
seekTo(long msec)
播放指定的时间位置。
void
setScreenOnWhilePlaying(boolean screenOn)
控制在播放时是否熄屏。
三、代码编写
这里有个需要注意的地方:一般加载比较小的资源时候可以使用prepare(),但是如果你加载资源比较大的或者是网络资源的时候就是一个耗时操作,我们都知道不能在主线程执行耗时操作,所以就需要使用prepareAsync()配合setOnPreparedListener()在准备完成后自动播放音频。
如果你不信这个邪你可以用prepare()加载网络资源试试。
/**
* 设置播放类型,之后调用stop方便切换类型。
*/
private int PLAY_STATE = -1;//判断是什么类型
public static final int PLAY_STATE0 = 1;//文件
public static final int PLAY_STATE1 = 2;//raw
public static final int PLAY_STATE2 = 3;//assets
public static final int PLAY_STATE3 = 4;//网络
private MediaPlayer mMediaPlayer = null;
//设置不同的回调
private MediaPlayFunctionListener mediaPlayFunctionListener;
private MediaPlayInfoListener mMediaPlayInfoListener;
//设置文件路径
public void setFilePlay(File file) {
this.targetFile = file;
PLAY_STATE = PLAY_STATE0;
stop();
}
//设置Raw播放
public void setRawPlay(Context context,int rawId){
this.mContext = context;
this.rawId = rawId;
PLAY_STATE = PLAY_STATE1;
stop();
}
//设置Assets播放
public void setAssetsName(Context context,String assetsName) {
this.mContext = context;
this.assetsName = assetsName;
PLAY_STATE = PLAY_STATE2;
stop();
}
//设置网络资源播放
public void setNetPath(String netPath) {
this.netPath = netPath;
PLAY_STATE = PLAY_STATE3;
stop();
}
//开始播放
public boolean start() {
if (PLAY_STATE == PLAY_STATE1){
mMediaPlayer = MediaPlayer.create(mContext,rawId);
}else {
mMediaPlayer = new MediaPlayer();
}
try {
switch (PLAY_STATE){
case PLAY_STATE0://本地文件为数据源传入路径
mMediaPlayer.setDataSource(targetFile.getAbsolutePath());
mMediaPlayer.prepare();
break;
case PLAY_STATE1://如果raw为数据源则不处理
break;
case PLAY_STATE2://Assets下文件为数据源
AssetFileDescriptor fileDescriptor = mContext.getAssets().openFd(assetsName);
mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(),fileDescriptor.getLength());
mMediaPlayer.prepare();
break;
case PLAY_STATE3://网络数据源 设置网络连接
mMediaPlayer.setDataSource(netPath);
mMediaPlayer.prepareAsync();
break;
}
//播放完成自动停止
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override public void onCompletion(MediaPlayer mediaPlayer) {
//停止播放
mediaPlayer.stop();
//回调停止播放的方法。
if (mediaPlayFunctionListener != null)
mediaPlayFunctionListener.stop();
//回调播放完成的方法
if (mMediaPlayInfoListener != null)
mMediaPlayInfoListener.onCompletion(mediaPlayer);
}
});
//准备完毕 自动播放
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
//准备完毕,回调准备和开始方法
if (mediaPlayFunctionListener != null) {
mediaPlayFunctionListener.prepared();
mediaPlayFunctionListener.start();
}
}
});
//播放错误监听
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override public boolean onError(MediaPlayer mp, int what, int extra) {
//回调错误方法
if (mMediaPlayInfoListener != null) {
mMediaPlayInfoListener.onError(mp, what, extra);
}
//回调停止方法
if (mMediaPlayer != null)
stop();
return false;
}
});
//网络缓冲监听
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override public void onBufferingUpdate(MediaPlayer mp, int percent) {
//回调网络缓冲方法
if (mMediaPlayInfoListener != null)
mMediaPlayInfoListener.onBufferingUpdate(mp,percent);
}
});
//调整进度监听
mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override public void onSeekComplete(MediaPlayer mp) {
//回调调整进度后的方法,这里只有调整播放位置后才会调用
if (mMediaPlayInfoListener != null)
mMediaPlayInfoListener.onSeekComplete(mp);
}
});
} catch (IOException e) {
e.printStackTrace();
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
boolean result = (mMediaPlayer != null);
this.isPlaying = result;
return result;
}
//停止播放
public void stop() {
this.isPlaying = false;
this.duration = 0;
if (mMediaPlayer != null) {
mHandler.removeCallbacks(mRunnable);
mMediaPlayer.stop();
mMediaPlayer.reset();
if (mediaPlayFunctionListener != null)
mediaPlayFunctionListener.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
//resume调用 继续播放也调用此方法即可
public void resume() {
if (mMediaPlayer != null) {
this.isPlaying = true;
mHandler.postDelayed(mRunnable,sleep);
mMediaPlayer.start();
}
}
//暂停
public void pause() {
this.isPlaying = false;
mHandler.removeCallbacks(mRunnable);
if (mMediaPlayer != null) {
mMediaPlayer.pause();
if (mediaPlayFunctionListener != null)
mediaPlayFunctionListener.pause();
}
}
我已经把MediaPlayer写成工具类上传到Github中具体的使用方法可以查看Wiki,如果你想直接使用导入依赖即可,如果你不想去Github想直接修改或者自定义其他方法直接下载 mediaplaylib (提取码: xnv5) 即可
android mediaplayer 权限,Android — 使用MediaPlayer进行音频播放相关推荐
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
文章目录 一.Android 逆向中使用的 android.permission 权限 二.Android 系统中的 Linux 用户权限 一.Android 逆向中使用的 android.permi ...
- 【创新项目实训】Android移动开发教学app案例之音频播放器(二)
教学app案例之音频播放器(二) 一.开发环境 二.项目介绍 三.开始主界面 四.显示歌曲列表 五.播放音乐的服务 六.实现播放音乐 一.开发环境 软件环境: Android Studio 4.1.3 ...
- android组件权限,Android中Permission权限机制的具体使用
由上篇Android Permission权限机制引子,我们知道Android 通过在每台设备上实施了基于权限的安全策略来处理安全问题,采用权限来限制安装应用程序的能力.本篇文章继续来探讨和Andro ...
- Android通过意图使用内置的音频播放器
假设实现一个音频文件的播放,那么在应用程序中提供播放音频文件功能的最简单的方式是利用内置的"Music(音乐)"应用程序的功能--即使用系统自带的或已安装好的音乐播放器来播放指定的 ...
- android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意
AudioRecord需要至少 这项录音权限.有时候在AndroidManifest.xml中加进去后,有些手机系统仍然没有授予该权限.需要到手机的设置中的权限管理,把这项权限打开.没权限就会闪退.如 ...
- android audiotrack权限,android 使用 audiorecord 和 audiotrack 实现实时录音播放
基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest; import java.io.IOExc ...
- android wifimanager权限,Android 6.0.1 - 权限问题= wifiManager.getScanResults()返回0
permissionsList.add()不起作用,但MainActivity.this.requestPermissions()正常工作.问题是它带来一个对话框询问用户是否允许位置权限.Androi ...
- android 访问权限,Android 使用情况访问权限
问题描述 添加了使用情况访问权限,如果不开启权限就不让进去,但是发现如果不开启,直接点击返回的话,会再次进入页面但是下面的列表数据不出现 问题出现的环境背景及自己尝试过哪些方法 第一次出现(进软件的时 ...
- android cta 权限,[Android][Framework]PackageManagerService处理应用权限流程
app种类 1.system app (有ApplicationInfo.FLAG_SYSTEM标记) 2.privileged app (有ApplicationInfo.FLAG_SYSTEM和A ...
最新文章
- Java三大主流开源工作流引擎技术分析
- bash文件外传入参数
- 感受学生考勤“智慧化”变革 签到荚让校园更智慧
- std::jthread与std::thread的区别
- java面向对象super,final,static,匿名对象,内部类学习
- Vivado过程文件解释
- @SpringBootApplication与@EnableAutoConfiguration区别
- Pandas直接读取sql脚本
- 网络协议TCP/IP、IPX/SPX、NETBEUI简介
- 装逼技能:怎样优雅地摆放桌面图标?
- Python 制作迷宫游戏(一)——地图
- 树莓派——TSL2561获取光强数值(C语言)
- 切片软件 cura linux,Ubuntu系统入门教程-3D打印切片软件cura
- VSCODE无法使用unordered_map解决
- 购买Blender cloud支援今年官方开源电影Gooseberry
- FFmpeg多媒体文件处理(ffmpeg打印音视频Meta信息)
- 代谢组与转录组联合分析方法介绍
- 2021年高考成绩查询衡阳市八中,快讯!2020年衡阳各学校高考成绩揭晓!
- linux tcp fin wait1,关于FIN_WAIT1
- c语言outl函数,在作业中Outlook