手机音频解码芯片多媒体音频锁了怎么解

Android多媒体-MediaPlayer唤醒锁及音频焦点
MediaPlayer的唤醒锁
  一般使用MediaPlayer播放音频流,推荐使用一个Service来承载MediaPlayer,而不是直接在Activity里使用。但是的功耗设计里,为了节约电池消耗,如果设备处于睡眠状态,系统将试图降低或者关闭一些没设备必须的特性,包括CUP和Wifi硬件,然后,如果是一个后台播放音乐的应用,降低CUP可能导致在后台运行的时候干扰音频的正常播放,关闭Wifi将可能导致网络音频流的获取出现错误。
  为了确保MediaPlayer的承载的服务在系统睡眠的时候继续正常运行下去,Android为我们提供了一种唤醒锁(wake locks)的机制。它可以在系统睡眠的,依然保持锁定硬件的正常工作。
  确保在MediaPlayer运行的时候,哪怕系统睡眠了CUP也能正常运行,需要使用MediaPlayer.setWakeMode()为MediaPlayer设定唤醒锁。下面是setWakMode()的签名:
  setWakeMode(Context context, int mode)
  第一个参数是当前上下文,第二个参数为需要加锁的状态,被设定为int类型的常量,定义在PowerManager这个final类中。PowerManager是专门用来管理Android功率消耗的锁定状态,与锁定CUP相关的,有四种,分别设定CUP、屏幕、键盘等的各种保持唤醒的状态,在这里只需要设定为PARTIAL_WAKE_LOCK即可。
mediaPlayer = new MediaPlayer();
// 设定CUP锁定
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);一般对于锁而言,锁定了通常需要解锁,但是这里的唤醒说与MediaPlayer关联,所以只需要在使用完之后release()释放MediaPlayer即可,无需显式的为其解锁。在使用setWakeMode设定唤醒锁的时候,还必须为应用赋予相应的权限:
再来说说如何锁定wifi硬件在系统睡眠的时候保持正常运行。wifi锁通过WifiLock进行操作,而WifiLock通过WifiManager进行管理,通过WifiManager.createWifiLock()进行Wifi锁定。
    WifiManager.WifiLock createWifiLock(int lockType, String tag)
  这个方法有多个重载,这里介绍的这个,第一个参数设定锁的状态,为一个int类型的常量,定义在Context类中,这里的应用场景一般设定为WIFI_MODE_FULL即可。第二个参数为WifiLock的标志,用于确定wifiLock的。
wifiLock= ((WifiManager) getSystemService(this.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
wifiLock.acquire();
当然,在应用中把Wifi锁定之后,还需要在MediaPlayer.release()的时候为wifi硬件解锁,为避免意外关闭的情况,最好在Android的onDestory()里对其进行释放,释放Wifi锁使用WifiLock.release()。
* 停止播放
protected void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
// 释放wifi锁
wifiLock.release();
btn_play.setEnabled(true);
Toast.makeText(this, "停止播放", 0).show();
protected void onDestroy() {
// 在activity结束的时候回收资源
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
// 释放wifi锁
wifiLock.release();
super.onDestroy();
MediaPlayer的音频焦点
  众所周知,Android是一个多任务的操作系统,所以对于音频的播放,也许有几个不同的媒体服务会同时播放,这样可能导致一个比较杂乱的声音环境,而错过一些重要的声音提醒。在Android2.2之后,Android提供了一种应用协商使用设备音频输出的机制,这种机制称为音频焦点。
  当应用程序需要输出音频或通知的时候,需要请求音频焦点,当请求得到音频焦点之后,监听音频焦点的变换,当音频焦点变换了,根据返回回来的音频焦点码进行相应的处理。音频焦点的注册使用音频管理器的AudioManager.requestAudioFocus()方法设定。它的签名如下:
    int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)
  这个方法的返回值是int类型,其含义被定义在AudioManager中以常量表示AUDIOFOCUS_REQUEST_FAILED(获取音频焦点成功)、AUDIOFOCUS_REQUEST_GRANTED(获取音频焦点失败)。其中重要的是第一个参数,为音频焦点变化的回调函数,在其中可以设定如果音频焦点变换了,当前应用如何管理MediaPlayer,第二个参数为媒体流的类型,第三个参数为持续的状态。
  AudioManager.OnAudioFocusChangeListener为音频焦点变换的监听器,其中需要实现一个方法:onAudioFocusChange(int focusChange)在音频焦点变换的时候回调。它有一个参数,为当前表示音频焦点对于当前应用的状态码,通过这个状态码指定对应的操作,有些时候音频状态改变了,并不一定需要停止音频的播放。
  focusChange有一下几种状态码:
AUDIOFOCUS_GAIN:获得音频焦点。
AUDIOFOCUS_LOSS:失去音频焦点,并且会持续很长时间。这是我们需要停止MediaPlayer的播放。
AUDIOFOCUS_LOSS_TRANSIENT:失去音频焦点,但并不会持续很长时间,需要暂停MediaPlayer的播放,等待重新获得音频焦点。
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:暂时失去音频焦点,但是无需停止播放,只需降低声音方法。
audioManager = (AudioManager) getSystemService(this.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(
new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
// 获得音频焦点
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
// 还原音量
mediaPlayer.setVolume(1.0f, 1.0f);
case AudioManager.AUDIOFOCUS_LOSS:
// 长久的失去音频焦点,释放MediaPlayer
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// 展示失去音频焦点,暂停播放等待重新获得音频焦点
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// 失去音频焦点,无需停止播放,降低声音即可
if (mediaPlayer.isPlaying()) {
mediaPlayer.setVolume(0.1f, 0.1f);
}, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
  以上就讲解了MediaPlayer的一些高级的内容,在掌握了MediaPlayer的使用之后,开发有关音乐播放类的应用的时候就可以得心应手了。从用户体验的方面出发,如果真实开发一款播放器类的软件,需要监听AUDIO_BECOMING_NOISY的广播,它会在音频输出源从其他输出源变换到设备扬声器的时候发出此广播,监听广播在音频输出源改变到设备扬声器的时候,停止播放,这样确保在耳机或额外的音频输出硬件与设备断开连接的时候,不至于重新从扬声器继续输出音频播放。
链接:https://download.csdn.net/detail/duanyu218/7475569Android多媒体-MediaPlayer唤醒锁及音频焦点 - CSDN博客
Android多媒体-MediaPlayer唤醒锁及音频焦点
MediaPlayer的唤醒锁
  一般使用MediaPlayer播放音频流,推荐使用一个Service来承载MediaPlayer,而不是直接在Activity里使用。但是Android系统的功耗设计里,为了节约电池消耗,如果设备处于睡眠状态,系统将试图降低或者关闭一些没设备必须的特性,包括CUP和Wifi硬件,然后,如果是一个后台播放音乐的应用,降低CUP可能导致在后台运行的时候干扰音频的正常播放,关闭Wifi将可能导致网络音频流的获取出现错误。
  为了确保MediaPlayer的承载的服务在系统睡眠的时候继续正常运行下去,Android为我们提供了一种唤醒锁(wake locks)的机制。它可以在系统睡眠的,依然保持锁定硬件的正常工作。
  确保在MediaPlayer运行的时候,哪怕系统睡眠了CUP也能正常运行,需要使用MediaPlayer.setWakeMode()为MediaPlayer设定唤醒锁。下面是setWakMode()的签名:
  setWakeMode(Context context, int mode)
  第一个参数是当前上下文,第二个参数为需要加锁的状态,被设定为int类型的常量,定义在PowerManager这个final类中。PowerManager是专门用来管理Android功率消耗的锁定状态,与锁定CUP相关的,有四种,分别设定CUP、屏幕、键盘等的各种保持唤醒的状态,在这里只需要设定为PARTIAL_WAKE_LOCK即可。
mediaPlayer = new MediaPlayer();
// 设定CUP锁定
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);一般对于锁而言,锁定了通常需要解锁,但是这里的唤醒说与MediaPlayer关联,所以只需要在使用完之后release()释放MediaPlayer即可,无需显式的为其解锁。在使用setWakeMode设定唤醒锁的时候,还必须为应用赋予相应的权限:
&uses-permission android:name=&android.permission.WAKE_LOCK&/&再来说说如何锁定wifi硬件在系统睡眠的时候保持正常运行。wifi锁通过WifiLock进行操作,而WifiLock通过WifiManager进行管理,通过WifiManager.createWifiLock()进行Wifi锁定。
    WifiManager.WifiLock createWifiLock(int lockType, String tag)
  这个方法有多个重载,这里介绍的这个,第一个参数设定锁的状态,为一个int类型的常量,定义在Context类中,这里的应用场景一般设定为WIFI_MODE_FULL即可。第二个参数为WifiLock的标志,用于确定wifiLock的。
wifiLock= ((WifiManager) getSystemService(this.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, &mylock&);
wifiLock.acquire();
当然,在应用中把Wifi锁定之后,还需要在MediaPlayer.release()的时候为wifi硬件解锁,为避免意外关闭的情况,最好在Android组件的onDestory()里对其进行释放,释放Wifi锁使用WifiLock.release()。
* 停止播放
protected void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
// 释放wifi锁
wifiLock.release();
btn_play.setEnabled(true);
Toast.makeText(this, &停止播放&, 0).show();
protected void onDestroy() {
// 在activity结束的时候回收资源
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
// 释放wifi锁
wifiLock.release();
super.onDestroy();
MediaPlayer的音频焦点
  众所周知,Android是一个多任务的操作系统,所以对于音频的播放,也许有几个不同的媒体服务会同时播放,这样可能导致一个比较杂乱的声音环境,而错过一些重要的声音提醒。在Android2.2之后,Android提供了一种应用协商使用设备音频输出的机制,这种机制称为音频焦点。
  当应用程序需要输出音频或通知的时候,需要请求音频焦点,当请求得到音频焦点之后,监听音频焦点的变换,当音频焦点变换了,根据返回回来的音频焦点码进行相应的处理。音频焦点的注册使用音频管理器的AudioManager.requestAudioFocus()方法设定。它的签名如下:
    int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)
  这个方法的返回值是int类型,其含义被定义在AudioManager中以常量表示AUDIOFOCUS_REQUEST_FAILED(获取音频焦点成功)、AUDIOFOCUS_REQUEST_GRANTED(获取音频焦点失败)。其中重要的是第一个参数,为音频焦点变化的回调函数,在其中可以设定如果音频焦点变换了,当前应用如何管理MediaPlayer,第二个参数为媒体流的类型,第三个参数为持续的状态。
  AudioManager.OnAudioFocusChangeListener为音频焦点变换的监听器,其中需要实现一个方法:onAudioFocusChange(int focusChange)在音频焦点变换的时候回调。它有一个参数,为当前表示音频焦点对于当前应用的状态码,通过这个状态码指定对应的操作,有些时候音频状态改变了,并不一定需要停止音频的播放。
  focusChange有一下几种状态码:
AUDIOFOCUS_GAIN:获得音频焦点。
AUDIOFOCUS_LOSS:失去音频焦点,并且会持续很长时间。这是我们需要停止MediaPlayer的播放。
AUDIOFOCUS_LOSS_TRANSIENT:失去音频焦点,但并不会持续很长时间,需要暂停MediaPlayer的播放,等待重新获得音频焦点。
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:暂时失去音频焦点,但是无需停止播放,只需降低声音方法。
audioManager = (AudioManager) getSystemService(this.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(
new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
// 获得音频焦点
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
// 还原音量
mediaPlayer.setVolume(1.0f, 1.0f);
case AudioManager.AUDIOFOCUS_LOSS:
// 长久的失去音频焦点,释放MediaPlayer
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// 展示失去音频焦点,暂停播放等待重新获得音频焦点
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// 失去音频焦点,无需停止播放,降低声音即可
if (mediaPlayer.isPlaying()) {
mediaPlayer.setVolume(0.1f, 0.1f);
}, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
  以上就讲解了MediaPlayer的一些高级的内容,在掌握了MediaPlayer的使用之后,开发有关音乐播放类的应用的时候就可以得心应手了。从用户体验的方面出发,如果真实开发一款播放器类的软件,需要监听AUDIO_BECOMING_NOISY的广播,它会在音频输出源从其他输出源变换到设备扬声器的时候发出此广播,监听广播在音频输出源改变到设备扬声器的时候,停止播放,这样确保在耳机或额外的音频输出硬件与设备断开连接的时候,不至于重新从扬声器继续输出音频播放。
源码链接:
本文已收录于以下专栏:
相关文章推荐
Handling audio focus
Even though only one activity can run at any given time, Android is amulti-tas...
Android Media Playback 中的MediaPlayer的用法及注意事项
声明:以下内容翻译自Android官网,由于译者水平有限,本文出现的错误请大家批评指正,谢谢!
尊重劳动成果,...
Android Media Playback 中的MediaPlayer的用法及注意事项(二)
1.搭配Service来使用MediaPlayer
如果你想你的多媒体文件在后台被播放,即使...
播放音乐类软件,用户在调节音量的时候,弹出系统的媒体音量界面,与项目的设计风格格格不入。
于是,调节音量,同时显示自己定义的媒体音量界面很有必要。
1)调整音乐音量
private Aud...
本文译自:/training/managing-audio/volume-playback.html
良好的用户体验是具有可预见性的。如果你的...
MediaPlayer既可以播放音频又可以播放视频,基本遇到的问题就是我在听音乐的时候播放音频或视频,出现了重叠的声音。这样对用户体验来说有些不太好,要控制别的应用是不可能的,所以只有去抢占声道了。当...
MediaPlayer类
静态构造方法
public static MediaPlayer create(Con...
MediaPlayer播放音频
还有一种是soundpool 播放多个短促声音 游戏常用
0.添加权限:
uses-permission android:na...
在动手写这篇学习笔记的时候其实我是沮丧的,因为此前的两天时间我都在折腾ANDROID多媒体编程这块,所谓多媒体编程就是指调用Android提供的api对文本、图片、音频、视频等做相应的处理,比如图片的...
MediaPlayer类
静态构造方法
public static MediaPlayer create(Context context, Uri ur...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 pr没有解锁音频 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信