【Android Advanced Training - 03】管理音频播放[Lesson 2 - 管理音频焦点Audio Focus]-程序员宅基地

技术标签: 移动开发  

Managing Audio Focus[管理音频焦点]

  • 很多App都可以播放音频,因此在播放前如何获取到音频焦点就显得很重要了,这样可以避免同时出现多个声音,Android使用audio focus来节制音频的播放,仅仅是获取到audio focus的App才能够播放音频。
  • 在App开始播放音频之前,它需要经过发出请求[request]->接受请求[receive]->音频焦点锁定[Audio Focus]的过程。同样,它需要知道如何监听失去音频焦点[lose of audio focus]的事件并进行合适的响应。

Request the Audio Focus [请求获取音频焦点]

  • 通过call requestAudioFocus() 方法来获取你想要获取到的音频流焦点。如果请求成功这个方法会返回AUDIOFOCUS_REQUEST_GRANTED
  • 我们必须指定正在使用哪个音频流,而且是否想请求短暂还是永久的audio focus。
  • 短暂的焦点锁定:当期待播放一个短暂的音频的时候(比如播放导航指示)
  • 永久的焦点锁定:当计划播放可预期到的较长的音频的时候(比如播放音乐)
  • 下面是一个在播放音乐的时候请求永久的音频焦点的例子,我们必须在开始播放之前立即请求音频焦点,比如在用户点击播放或者游戏程序中下一关开始的片头音乐。
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Request audio focus for playback int result = am.requestAudioFocus(afChangeListener, // Use the music stream. AudioManager.STREAM_MUSIC, // Request permanent focus. AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); // Start playback. }
// Abandon audio focus when playback complete am.abandonAudioFocus(afChangeListener);
  • 当请求短暂音频焦点的时候,我们可以选择是否开启“ducking”。
  • Ducking是一个特殊的机制使得允许音频间歇性的短暂播放。
  • 通常情况下,一个好的App在失去音频焦点的时候它会立即保持安静。如果我们选择在请求短暂音频焦点的时候开启了ducking,那意味着其它App可以继续播放,仅仅是在这一刻降低自己的音量,在短暂重新获取到音频焦点后恢复正常音量[也就是说:不用理会这个请求短暂焦点的请求,这并不会导致目前在播放的音频受到牵制,比如在播放音乐的时候突然出现一个短暂的短信提示声音,这个时候仅仅是把播放歌曲的音量暂时调低,好让短信声能够让用户听到,之后立马恢复正常播放]。
// Request audio focus for playback int result = am.requestAudioFocus(afChangeListener, // Use the music stream. AudioManager.STREAM_MUSIC, // Request permanent focus. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // Start playback. }

Handle the Loss of Audio Focus[处理失去音频焦点]

  • 如果A程序可以请求获取音频焦点,那么在B程序请求获取的时候,A获取到的焦点就会失去。显然我们需要处理失去焦点的事件。
  • 在音频焦点的监听器里面,当接受到描述焦点改变的事件时会触发onAudioFocusChange()回调方法。对应于获取焦点的三种类型,我们同样会有三种失去焦点的类型。
    • 失去短暂焦点:通常在失去这种焦点的情况下,我们会暂停当前音频的播放或者降低音量,同时需要准备恢复播放在重新获取到焦点之后。
    • 失去永久焦点:假设另外一个程序开始播放音乐等,那么我们的程序就应该有效的结束自己。实用的做法是停止播放,移除button监听,允许新的音频播放器独占监听那些按钮事件,并且放弃自己的音频焦点
    • 在重新播放器自己的音频之前,我们需要确保用户重新点击自己App的播放按钮等。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT // Pause playback } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Resume playback } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); am.abandonAudioFocus(afChangeListener); // Stop playback } } }; 在上面失去短暂焦点的例子中,如果允许ducking,那么我们可以选择“duck”的行为而不是暂停当前的播放。

Duck! [闪避]

Ducking是一个特殊的机制使得允许音频间歇性的短暂播放。在Ducking的情况下,正常播放的歌曲会降低音量来凸显这个短暂的音频声音,这样既让这个短暂的声音比较突出,又不至于打断正常的声音。
请看例子:
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK // Lower the volume } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Raise it back to normal } } };
监听失去音频焦点是最重要的广播之一,但不是唯一的方法。系统广播了一系列的intent来警示你去改变用户的音频使用体验。下节课会演示如何监视那些广播来提升用户的整体体验。

学习自:http://developer.android.com/training/managing-audio/audio-focus.html
转载请注明出处:http://blog.csdn.net/kesenhoo,谢谢!



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_20954/article/details/82300217

智能推荐

二分查找算法总结-程序员宅基地

文章浏览阅读7.1k次。1 二分查找简介  二分查找也叫折半查找,是一种常见的查找方法,它将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间。  二分查找必须具备两个条件,一是数列必须使用顺序存储结构(例如数组),二是数列必须有序。2 二分查找的原理及实现  以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。  每次比较的数列长度都会是之前数列的一半,直到找到相等

报“ Got minus one from a read call”的错误-程序员宅基地

文章浏览阅读1.8k次。在部署应用的时候,有时候应用可以直接启动,但偶尔应用却无法启动,报错信息是: java.sql.SQLRecoverableException: IO Error: Got minus one from a read call原因及解决方法我有好几个应用系统需要连接数据库,测试发现如果这个应用在最开始启动就不会报错,如果是启动了好几个应用之后再启动的话就会报错了。 一个应用连接数据库的时候..._error druiddatasource init 903 got minus one from a read call

C语言-第二章C语言的数据类型和变量_位变量类型的符号是-程序员宅基地

文章浏览阅读448次。printf() 的作⽤是将参数⽂本输出到屏幕,就是给printf传进去一些信息,这些信息就叫参数,把参数的信息输出到屏幕上。它名字⾥⾯的 f 代表 format (格式化),表⽰可以 定制输出⽂本的格式。例如:上⾯命令会在屏幕上输出⼀⾏⽂字“Hello World”。printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换 ⾏。为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n。_位变量类型的符号是

亲测破解戴尔服务器windows server 2008 的登录密码_怎么扫描winserver2008密码-程序员宅基地

文章浏览阅读858次,点赞22次,收藏20次。然后我看到pe上有个选项“Windows密码破解工具”,看了一下,说可以尝试绕过密码登陆,反正死马当活马医呗,就试试,等待几十秒,一下子看到了黎明的曙光,竟然进入的系统,心情那个激动,赶紧看看是否可以修改密码,进去修改密码时,直接让输入新密码,不像以前,还让你输入原密码,有戏,改了密码后,重启,输入新密码,哈哈哈,竟然成功了。所以让机房的人重启一下服务器,可是后面还是不行,也咨询了客户和知道密码的人,是否更改过密码,都说没有,那没有办法了,无法登陆,难免会被人利用服务器,要感觉想办法夺回来。

for语句循环-程序员宅基地

文章浏览阅读868次,点赞18次,收藏18次。for语句,也称为for循环,是编程语言中的一种控制流程结构,它包含三个基本部分:初始化表达式、条件表达式和后续表达式。初始化表达式:在循环开始之前执行,通常用于初始化循环控制变量。条件表达式:在每次循环开始之前进行判断,如果条件为真,则执行循环体;否则,退出循环。后续表达式:在每次循环结束后执行,通常用于更新循环控制变量的值。初始化:在循环开始之前执行,通常用于初始化循环控制变量。条件:在每次循环开始之前进行判断,如果条件为真,则执行循环体;否则,退出循环。更新。

win10开启关闭防火墙以及报错处理和其他段ip无法连接本机远程桌面-程序员宅基地

文章浏览阅读329次,点赞4次,收藏8次。面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

随便推点

如何高亮显示文件中选中的相同变量_keil高亮显示所有选中的变量-程序员宅基地

文章浏览阅读9.8k次。比如在a.java中有多个int i,点击i高亮显示文件中出现的所有该i变量,该功能eclipse默认是开启的,也可以通过Windows->Preferences->Java-> Editor-> Mark Occurrences,勾选选项。这时,当你单击一个元素的时候,代码中所有该元素存在的地方都会被高亮显示 _keil高亮显示所有选中的变量

cocos2d-x lua 屏幕适配_main.lua 全屏显示-程序员宅基地

文章浏览阅读2.4k次。转载请注明原文地址:https://segmentfault.com/a/1190000000635287研究了两天屏幕适配,了解了Cocos提供的屏幕适配的方案有下面几种:1, EXACT_FIT使用这个选项,可以保证设计区域完全铺满屏幕,但是可能会出现界面被拉伸。2, SHOW_ALL按原始比例进行缩放,图片不变形,为了保证缩放后较长的边也能完全显示,较短的边剩下的位置会用黑边填充,居中显示。..._main.lua 全屏显示

苹果CMS扩展集成接口,30个后端集成API(含接口文档)_苹果cmsapi对接app文档-程序员宅基地

文章浏览阅读8.1k次。苹果CMS已不用过多介绍了,老牌cms了,很成熟了。可以做很多类型的应用。此套接口,是之前定制开发过APP的一整套接口,之后又增加了代理开卡的功能。共近30个接口,可以玩很多种花样。如果你是个前端工程师,不会写后端,想借助苹果cms二开去做一款APP/小程序/网站. 这套源码已经相当于把后端给你写好了。你直接带着你的原型/思路,连逻辑就好了。 省一半的开发费用。详细可参考:苹果CMS后端接口完整版 源码(含代理提卡功能)_吉吉源码........._苹果cmsapi对接app文档

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)-程序员宅基地

文章浏览阅读1.7k次,点赞34次,收藏40次。本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关,从而实现智能物联。_nodemcu

【Java基础知识 8】String、StringBuilder、StringBuffer详解-程序员宅基地

文章浏览阅读877次,点赞8次,收藏19次。从上面的代码就可以看出“+”连接字符串的底层,实际上就是StringBuilder对象通过append,再调用toString完成的。

【Python学习篇】Python基础入门学习——你好Python(一)-程序员宅基地

文章浏览阅读639次,点赞25次,收藏26次。首先,不管Python,我们先明白,什么是编程语言语言:进行沟通交流的表达方式人类翻译官无法沟通,那要怎么做才能和计算机交流呢?以Python为例。

推荐文章

热门文章

相关标签