2-管理Audio焦点(Managing Audio Playback)

由于许多App都可能会播放多媒体文件,对于它们之间该如何相互作用就必须要充分考虑。为了避免所有的音乐App同时播放音乐,Android系统提供了audio焦点机制来控制多媒体文件的播放,只有获得了audio焦点的App能够播放音乐。

在你的App播放音频文件之前,需要请求并接受audio焦点。同样的,需要明白如何监听audio焦点的丢失并且在其发生时妥善处理。

Android系统Audio焦点的常用的操作方法如下:

Request the Audio Focus

    在你的App开始播放音乐之前,它应该持有一个它将会使用到的audio stream的audio焦点。获取焦点的操作由调用 requestAudioFocus()方法,并且在你请求成功的时候会返回 AUDIOFOCUS_REQUEST_GRANTED。

无论你想暂时或是永久地申请audio焦点,你应该指定哪一个audio stream你将会使用。在你期望播放一段短时间的音频的时候申请一个瞬间的audio焦点(例如播放导航指示音),在你播放长时音频的时候申请永久的audio焦点(例如播放音乐)。

下面的代码片段展示了在使用音乐audio stream时如何获取永久的audio焦点。你应该在你播放音频之前就申请audio焦点,例如在用户按下播放按钮或者是在进入下一个游戏难度时播放背景音乐之前就申请audio焦点。

 1 AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
 2 ...
 3
 4 // Request audio focus for playback
 5 int result = am.requestAudioFocus(afChangeListener,
 6                                  // Use the music stream.
 7                                  AudioManager.STREAM_MUSIC,
 8                                  // Request permanent focus.
 9                                  AudioManager.AUDIOFOCUS_GAIN);
10
11 if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
12     am.registerMediaButtonEventReceiver(RemoteControlReceiver);
13     // Start playback.
14 }

一旦你播放完音乐,一定要记住调用 abandonAudioFocus()方法,该方法会通知系统你不再需要audio焦点并且注销之前关联的 AudioManager.OnAudioFocusChangeListener监听器。在短暂地放弃焦点的情况下,android系统允许被打断的App继续播放音乐。

1 // Abandon audio focus when playback complete
2 am.abandonAudioFocus(afChangeListener);

在注册临时的audio焦点的时候你还有一个可选的操作方法:你是否想使用“ducking”机制。通常的,当一个正在播放音乐的app丢失audio焦点的时候,它就会立刻停止播放。通过使用“ducking”的方法来请求一个临时的焦点则可以避免上述情况,该机制允许正在播放音乐的App调低音量接着播放,直到audio焦点返还给它们,音量重新恢复。

 1 // Request audio focus for playback
 2 int result = am.requestAudioFocus(afChangeListener,
 3                              // Use the music stream.
 4                              AudioManager.STREAM_MUSIC,
 5                              // Request permanent focus.
 6                              AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
 7
 8 if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
 9     // Start playback.
10 }

“ducking”机制特别适合于仅需要短暂地获取audio焦点的场景,利用在利用导航软件听取导航指示时。

其他的App无论何时如上述的方法请求audio焦点,是想获取永久的audio焦点或者是临时的audio焦点(不管是否支持“ducking”机制),它们都是通过它们注册的监听器来获取audio焦点的。

    处理Audio焦点的丢失问题

如果你的App能够请求audio焦点,那么在众多的app都在请求audio焦点的时候它们会轮流地丢失焦点。你的App在丢失audio焦点的时候如何反应是根据丢失焦点的方式决定的。

你注册的audio焦点监听器通常会有一个 onAudioFocusChange()回调函数,它会携带一个描述audio焦点变化事件的变量。特别的,可能发生的audio焦点丢失事件与之前的焦点请求类型是对应的,有永久丢失,临时丢失以及允许“ducking”机制的临时丢失。

一般来说,一个临时的audio焦点丢失事件,通常会导致你的app使它使用的audio stream静音,但是从另一方面来说需要保存它的状态。你的App应该持续监听audio焦点的变化,随时准备着在重新获取到焦点的时候播放之前的音乐。

如果audio焦点丢失是永久的,应用程序已经被用户播放音乐了,那么你的app应该做出有效的响应。在实际操作中,通常是你的app需要停止播放,移除多媒体按钮事件的监听,允许正在播放音乐的播放器专一地处理那些事件,同时取消掉你自己的audio焦点。在这个时候,你应该设计出一种用户的操作(例如在你的app中点击播放),通过该操作来重新恢复你的音乐播放。

下面的代码片段展示出了在临时丢失audio焦点时,我们暂停我们的音乐播放,在重新获取audio焦点时,我们恢复播放。如果audio焦点是永久地丢失,则注销我们的多媒体按钮事件监听器,并且停止对audio焦点变化的监听。

 1 AudioManager.OnAudioFocusChangeListener afChangeListener =
 2     newAudioManager.OnAudioFocusChangeListener(){
 3         publicvoid onAudioFocusChange(int focusChange){
 4             if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT){
 5                 // Pause playback
 6             }elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){
 7                 // Resume playback
 8             }elseif(focusChange ==AudioManager.AUDIOFOCUS_LOSS){
 9                 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
10                 am.abandonAudioFocus(afChangeListener);
11                 // Stop playback
12             }
13         }
14     };

在临时丢失audio焦点的时候可能会遇到“ducking”机制允许的情况,这样你就不用暂停你的播放,你可以采用“duck”方法。

    Duck!

“ducking”机制是在其他的app申请audio焦点的时候降低你的app使用的audio steam的音量,从而避免直接屏蔽掉你的app的一种机制。

下面的代码片段展示了在临时丢失audio焦点的时候调低你的app的音量,并且在重新获取到audio焦点的时候将音量恢复到之前的大小。

1 OnAudioFocusChangeListener afChangeListener =newOnAudioFocusChangeListener(){
2     publicvoid onAudioFocusChange(int focusChange){
3         if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
4             // Lower the volume
5         }elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){
6             // Raise it back to normal
7         }
8     }
9 };

audio焦点的丢失是最重要的需要作出反应的广播事件,但是并不是唯一的。系统会广播许多的intents来提醒你对于你的app作出调整,一遍提高用户的体验。下一节会展示出你怎么合理应对上述的广播事件能够提高用户的体验。

时间: 2024-10-24 22:50:18

2-管理Audio焦点(Managing Audio Playback)的相关文章

1-控制App的音量和多媒体文件的播放(Managing Audio Playback)

良好的用户体验是可以被预测的.如果你的App需要播放多媒体,那么你的用户可以通过你的App利用硬件或软件的方式来控制他们的设备的音量,蓝牙耳机,头带耳机等对于他们来说是非常必要的. 同样的,在哪个位置合理恰当地提供播放.停止.暂停.跳过以及回放功能的按钮需要根据他们各自在你的App中对于audio stream的处理来决定. 控制App的音量和多媒体文件的播放主要有以下三个方面:     确认需要使用哪个Audio Stream       建立一个可预测的audio体验的第一步是理解你的App

管理音频焦点

由于可能会有多个应用可以播放音频,所以我们应当考虑一下他们应该如何交互.为了防止多个音乐播放应用同时播放音频,Android使用音频焦点(Audio Focus)来控制音频的播放--即只有获取到音频焦点的应用才能够播放音频. 在我们的应用开始播放音频之前,它需要先请求音频焦点,然后再获取到音频焦点.另外,它还需要知道如何监听失去音频焦点的事件并对此做出合适的响应. 请求获取音频焦点(Request the Audio Focus) 在我们的应用开始播放音频之前,它需要获取将要使用的音频流的音频焦

audio与Web Audio

做H5游戏难免会遇到需要播放背景音乐或者音效的时候.一开始看到这个需求第一反应就是用H5中的audio标签去实现,但是在实现的过程中发现它存在很多的问题. 1.只能播放单一音频(在包括IOS在内的某些设备上).什么意思呢?就是说如果你同时在播放背景音乐的时候播放音效的话,背景音乐会被停掉.这是一个非常严肃的问题. 2.在IOS中不能预加载.这会导致H5游戏在IOS中播放音效时,只能实时的去拉去音频数据,会对性能造成一定影响.而且在加载的过程中去设置audio的某些属性会报错. 3.在包括IOS在

3-响应音频输出的硬件(Managing Audio Playback)

用户在使用他们的android设备进行多媒体交互的时候通常有多种选择,大多数的设备有一个内置的话筒,有线耳机的插孔,还有一些会提供对于蓝牙设备的支持以及A2DP的支持等等. 检查哪个设备正在被使用 你的app应该受正在使用的音频播放设备的影响从而做出合理的响应. 下面的代码片段展示出,你可以请求 AudioManager来检查音频播放是否正被系统导向到设备的喇叭,有线耳机或者是蓝牙设备. 1 2 if(isBluetoothA2dpOn()){ 3 // Adjust output for Bl

管理音频播放(摘自Android官方培训课程中文版(v0.9.5))

编写:kesenhoo - 原文:http://developer.android.com/training/managing-audio/index.html 如果我们的应用能够播放音频,那么让用户能够以自己预期的方式控制音频是很重要的.为了保证良好的用户体验,我们应该让应用能够管理当前的音频焦点,因为这样才能确保多个应用不会在同一时刻一起播放音频. 在学习本系列课程中,我们将会创建可以对音量按钮进行响应的应用,该应用会在播放音频的时候请求获取音频焦点,并且在当前音频焦点被系统或其他应用所改变

Playback audio data from memory in windows

Continue previous article : Understand wave format, and implement a wave reader, In here , I will demonstrate how to play audio in windows. (Zeroth are wave format, you could refer to previous article.) First , the struct WAVEFORMATEXwould be used, t

Android Audio Play Out Channel

1: 7嘴8舌 扬声器, 耳机, 和听筒 就是通过: audiomanager.setmode(AudioManager.MODE_IN_COMMUNICATION)audiomanager.setSpeakerhponeOn(boolean value).这两个来设置.不过有的好像不支持的. 米手机上切换 扬声器和听筒不能切换 Android AudioTrack音频播放分析 音频资源在播放时,会经常出现冲突的情况,如在进行音乐播放时有电话呼入.有新消息的提示音需要播放等,此类的并发处理就需要

android audio开发的一些专用术语(待翻译)

Audio Terminology IN THIS DOCUMENT Generic Terms Digital Audio Hardware and Accessories Audio Signal Path Android-Specific Terms Sample Rate Conversion This document provides a glossary of audio-related terminology, including a list of widely used, g

chromium audio 实现分析

转载请注明出处:http://blog.csdn.net/typename  powered by [email protected] 前言: 随着HTML5 标准完成制定,最近各种HTML5的猜测声音不断,在此不发表关于HTML5的未来意见,本文关注HTML5的新feature, audio标签.在HTML5中添加了新的标签,开发者可以直接使用audio标签嵌入音频,也可以直接使用video标签直接嵌入视频,其实这个标准在WHATWG早早已经被支持,只不过W3C最近才纳入标准.使用Androi