[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback
主要内容:
1 鉴别使用的是哪个音频流
2 使用物理音量键控制应用程序的音量
3 使用物理播放控制键来控制应用程序的音频播放
视频讲解:http://www.eyeandroid.com/thread-15877-1-1.html
控制应用程序的音量和音频的播放
一个好的用户体验是可预期可控的。如果应用程序是在播放音频,那么显然我们需要做到能够通过硬件按钮、软件按钮、蓝牙耳麦等来控制音量。
同样的,我们需要能够监听Media Button发出的播放、停止、暂停、跳过、上一首等动作,并且在应用程序所使用的Audio Stream上进行对应的响应。
鉴别使用的是哪个音频流
首先需要知道的是我们的应用程序会使用到哪些音频流。
Android为播放音乐、闹铃、通知铃、来电声音、系统声音,打电话声音与DTMF频道分别维护了一个隔离的音频流。这是我们能够控制不同音频的前提。
这些音频流中大多数都是被系统限制的,不能胡乱使用。除了你的应用程序是需要做替换闹铃操作,几乎其他的播放音频操作都是使用"STREAM_MUSIC"音频流。
使用硬件音量键来控制应用程序的音量
默认情况下,按下音量控制键会调节当前被激活的音频流,如果此时你的应用程序没有任何声音在播放,则会调节铃声的音量。
如果你的应用程序是一个游戏或者音乐程序,需要在不管是否目前正在播放歌曲或者游戏是否发出声音,按硬件的音量键都会使其音量得到调节。
我们需要监听音量键是否被按下,Android提供了setVolumeControlStream()的方法来直接控制指定的音频流的音量。
在鉴别出应用程序会使用哪个音频流之后,需要在Activity或者Fragment的onCreate中就调用setVolumeControlStream,这样能确保不管应用程序是否可见,音频控制功能都以用户的预期工作。
|
setVolumeControlStream(AudioManager.STREAM_MUSIC); |
使用硬件的播放控制按键来控制应用程序音频播放
媒体播放按钮,例如播放, 暂停, 停止, 跳过, 上一首等功能同样可以在一些线控,耳麦或者其他无线控制设备上实现。无论用户按下上面任何设备上的控制按钮,系统都会广播一个带有ACTION_MEDIA_BUTTON的Intent。
为了响应那些操作,需要像下面一样注册一个BroadcastReceiver在Manifest文件中。
|
<receiver android:name=".RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> |
Receiver需要判断这个广播是来自哪个按钮的操作,Intent在EXTRA_KEY_EVENT中包含了KEY信息,同样KeyEvent类包含了一系列KEYCODE_MEDIA_*的静态变量来表示不同的媒体按钮,例如KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT.
下面的代码演示如何获取按下的媒体按键以及如何对应地响应:
|
public class RemoteControlReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { // Handle key press. } } } } |
因为可能有多个程序都同样监听了这些控制按钮,那么必须在代码中特意控制当前哪个Receiver会进行响应。
下面的例子显示了如何使用AudioManager来注册监听与取消监听,通过这种方式,当Receiver被注册上时,它将是唯一响应Broadcast的Receiver。
|
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Start listening for button presses am.registerMediaButtonEventReceiver(RemoteControlReceiver); ... // Stop listening for button presses am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); |
通常,当应用程序变得不活跃或者不可见时(像是在onStop())回调期间),应用程序应该取消注册大多数的Receiver。但是在媒体播放的时候并没有那么简单,因为我们需要在后台播放歌曲的时候同样能够进行响应。一个比较好的注册与取消监听的方法是当程序获取与失去音频焦点的时候进行操作,这个内容会在后面的课程中详细讲解。
[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback的更多相关文章
- [Android Training视频系列] 8.2 Managing Audio Focus
视频讲解:http://www.eyeandroid.com/thread-15896-1-1.html 由于很多应用程序都可以播放音频,因此在播放前考虑它们如何交互就显得很重要了,为了避免同时出现多 ...
- [Android Training视频系列] 8.3 Dealing with Audio Output Hardware
用户在播放音乐的时候有多个选择,可以使用内置的扬声器,有线耳机或者是支持A2DP的蓝牙耳机.(补充:A2DP全名是Advanced Audio Distribution Profile 蓝牙音频传输模 ...
- android黑科技系列——获取加固后应用App的所有方法信息
一.前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这 ...
- Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...
- 【转载】Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...
- Android Training
Building Apps with Content Sharing Simple Data --> Intent && ActionProvider 介绍如何让应用程序共享简单 ...
- (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇
从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...
- [Android 性能优化系列]降低你的界面布局层次结构的一部分
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- Android libyuv应用系列(二)libyuv的使用
上篇文章Android libyuv使用系列(一)Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别中我们了解了YUV相关的知识,而本篇文章我会介绍libyuv是什么,以 ...
随机推荐
- OpenShare新功能@2014年10月
新功能@ Oct,2014 增强“应用中心”(就是“企业应用门户”功能):在Dock上增加“应用中心”图标,使得用户无论在任何页面,任何位置,永远都是点击一下即可进入任一企业应用,而无需回退到门户主页 ...
- 【转载】分析商品日均销量(DMS)对促销商品选择的意义
江苏省常州市信特超市有限公司副总经理高晓颖 随着中国零售业的进一步的开放,竞争日趋激烈,促销活动在日常经营中已经成为不可缺少的一部分,频繁的促销活动的开展,零售业经营管理者越来越觉得促销商品的选择难度 ...
- OpenGl从零开始之坐标变换
http://www.tuicool.com/articles/uiayYrI OpenGL学习脚印: 坐标变换过程(vertex transformation) http://blog.csdn.n ...
- 北大ACM(POJ1014-Dividing)
Question:http://poj.org/problem?id=1014 问题点:抽屉原理.dfs.多重背包. Memory: 248K Time: 16MS Language: C++ Res ...
- 北大ACM(POJ1009-Edge Detection)
Question:http://poj.org/problem?id=1009问题点:RLE编码. Memory: 648K Time: 547MS Language: C++ Result: Acc ...
- css3 画x图形
.m-act-del{ right:; top:; margin-top: -6px; position: absolute; display: inline-block; width: 20px; ...
- 1 。 LightOJ 1234 打表法(数据太大,把数据缩小100倍)
原题链接http://acm.hust.edu.cn/vjudge/contest/121397#problem/A Description In mathematics, the nth harmo ...
- ADO.NET笔记——使用Connection连接数据库,使用Command对象的ExecuteReader()方法创建DataReader对象返回多行数据
使用Connection连接数据库,使用DataReader访问数据库,并返回多行数据. 相关步骤: 需要引入两个命名空间 using System.Data; using System.Data.S ...
- Xcode中为代码添加特殊标记
有时候,我们需要在代码中搜索特殊的符号或者代码段,根据符号或使用搜索功能导航代码段效率并不算高.为了使用普通的英语标识重要的代码片段,可在代码中插入特殊格式的注释.这些注释不会在应用程序中添加任何特殊 ...
- Git的学习总结和使用时遇到的问题。
git 是一款非常强大的版本控制工具,现在市场占有率应该是一家独大了,以前用svn的童鞋估计都转投git阵营了吧 加上很多公司也用git管理自己的项目,所以 ...