上一篇说到音频录制的时候我就知道肯定会有音频播放这个功能,果不其然后续播放的需求又给我加上了,因为之前是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进行音频播放相关推荐

  1. 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

    文章目录 一.Android 逆向中使用的 android.permission 权限 二.Android 系统中的 Linux 用户权限 一.Android 逆向中使用的 android.permi ...

  2. 【创新项目实训】Android移动开发教学app案例之音频播放器(二)

    教学app案例之音频播放器(二) 一.开发环境 二.项目介绍 三.开始主界面 四.显示歌曲列表 五.播放音乐的服务 六.实现播放音乐 一.开发环境 软件环境: Android Studio 4.1.3 ...

  3. android组件权限,Android中Permission权限机制的具体使用

    由上篇Android Permission权限机制引子,我们知道Android 通过在每台设备上实施了基于权限的安全策略来处理安全问题,采用权限来限制安装应用程序的能力.本篇文章继续来探讨和Andro ...

  4. Android通过意图使用内置的音频播放器

    假设实现一个音频文件的播放,那么在应用程序中提供播放音频文件功能的最简单的方式是利用内置的"Music(音乐)"应用程序的功能--即使用系统自带的或已安装好的音乐播放器来播放指定的 ...

  5. android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意

    AudioRecord需要至少 这项录音权限.有时候在AndroidManifest.xml中加进去后,有些手机系统仍然没有授予该权限.需要到手机的设置中的权限管理,把这项权限打开.没权限就会闪退.如 ...

  6. android audiotrack权限,android 使用 audiorecord 和 audiotrack 实现实时录音播放

    基本思路就是用 audiorecord不断得到音频数据,然后使用audiotrack 播放 //得到音频 package com.ysg.audiotest; import java.io.IOExc ...

  7. android wifimanager权限,Android 6.0.1 - 权限问题= wifiManager.getScanResults()返回0

    permissionsList.add()不起作用,但MainActivity.this.requestPermissions()正常工作.问题是它带来一个对话框询问用户是否允许位置权限.Androi ...

  8. android 访问权限,Android 使用情况访问权限

    问题描述 添加了使用情况访问权限,如果不开启权限就不让进去,但是发现如果不开启,直接点击返回的话,会再次进入页面但是下面的列表数据不出现 问题出现的环境背景及自己尝试过哪些方法 第一次出现(进软件的时 ...

  9. android cta 权限,[Android][Framework]PackageManagerService处理应用权限流程

    app种类 1.system app (有ApplicationInfo.FLAG_SYSTEM标记) 2.privileged app (有ApplicationInfo.FLAG_SYSTEM和A ...

最新文章

  1. Java三大主流开源工作流引擎技术分析
  2. bash文件外传入参数
  3. 感受学生考勤“智慧化”变革 签到荚让校园更智慧
  4. std::jthread与std::thread的区别
  5. java面向对象super,final,static,匿名对象,内部类学习
  6. Vivado过程文件解释
  7. @SpringBootApplication与@EnableAutoConfiguration区别
  8. Pandas直接读取sql脚本
  9. 网络协议TCP/IP、IPX/SPX、NETBEUI简介
  10. 装逼技能:怎样优雅地摆放桌面图标?
  11. Python 制作迷宫游戏(一)——地图
  12. 树莓派——TSL2561获取光强数值(C语言)
  13. 切片软件 cura linux,Ubuntu系统入门教程-3D打印切片软件cura
  14. VSCODE无法使用unordered_map解决
  15. 购买Blender cloud支援今年官方开源电影Gooseberry
  16. FFmpeg多媒体文件处理(ffmpeg打印音视频Meta信息)
  17. 代谢组与转录组联合分析方法介绍
  18. 2021年高考成绩查询衡阳市八中,快讯!2020年衡阳各学校高考成绩揭晓!
  19. linux tcp fin wait1,关于FIN_WAIT1
  20. c语言outl函数,在作业中Outlook

热门文章

  1. 【JAVA】下载文件
  2. 高性能高并发系统的稳定性保障
  3. 编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。
  4. Unity制作头顶血条方式对比与优化
  5. windows上注册控件/反注册控件
  6. LaTex实战笔记 4-插入 Python 程序代码块
  7. PCB设计中常见的八个问题及解决方法
  8. 近乎万能的手机Rom刷机攻略~
  9. 电脑换IP后,改虚拟机里的IP
  10. git-hub 的使用指南