主要内容:
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。但是在媒体播放的时候并没有那么简单,因为我们需要在后台播放歌曲的时候同样能够进行响应。一个比较好的注册与取消监听的方法是当程序获取与失去音频焦点的时候进行操作,这个内容会在后面的课程中详细讲解。

视频讲解:http://www.eyeandroid.com/thread-15877-1-1.html

转载于:https://www.cnblogs.com/jiangu66/p/3199112.html

[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback相关推荐

  1. [Android Training视频系列]2.2 Pausing and Resuming an Activity

    [Android Training视频系列]2.2 Pausing and Resuming an Activity 1.主要内容 本讲介绍onPause和onResume,主要分析了在onPause ...

  2. [Android Training视频系列]2.4 Recreating an Activity

    [Android Training视频系列]2.4 Recreating an Activity 1.主要内容 本讲讲解onSaveInstanceState与onRestoreInstanceSta ...

  3. [Android Training视频系列] 8.3 Dealing with Audio Output Hardware

    [Android Training视频系列] 8.3 Dealing with Audio Output Hardware 用户在播放音乐的时候有多个选择,可以使用内置的扬声器,有线耳机或者是支持A2 ...

  4. [Android Samples视频系列之ApiDemos] App-Activity-Recreate

    [Android Samples视频系列之ApiDemos] App-Activity-Recreate 1.Demo说明与演示 该Demo演示如何动态切换Theme,要动态切换Theme必需recr ...

  5. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

  6. Android音视频系列(八):了解音频格式WAV以及与PCM的转换

    前言 之前我们已经了解了PCM音频数据,我们理解为最原始的数据,虽然他的音质是最棒的,但是同时也暴露出两个很重要的问题: 普通播放器无法播放,数据里不包含任何跟音频格式有关的信息(声道,采样率等等): ...

  7. android声音播放函数双声道合并,Android音视频系列(七):PCM音频单声道与双声道的相互转换...

    前言 上一篇我们已经学习了PCM音频的保存格式,这一篇我们通过掌握的知识,完成PCM音频的单声道和双声道的互相转换. 正文 首先我们把上一篇的最核心部分贴出来: PCM音频保存格式 我们首先完成单声道 ...

  8. Android音频格式转换,Android音视频系列(八):了解音频格式WAV以及与PCM的转换...

    前言 之前我们已经了解了PCM音频数据,我们理解为最原始的数据,虽然他的音质是最棒的,但是同时也暴露出两个很重要的问题: 普通播放器无法播放,数据里不包含任何跟音频格式有关的信息(声道,采样率等等): ...

  9. Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析...

    前言 前些天,测试MM发现了一个比较奇怪的bug. 具体表现是: 1.将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 [闪屏页Activity] ...

最新文章

  1. 老手讲解在JSP开发中与Web的中文问题解决方法
  2. python编程实例详解-Python编程之列表操作实例详解【创建、使用、更新、删除】...
  3. C#设计模式——生成器模式(Builder Pattern)
  4. 在IT的路上,我在成长
  5. 前端学习入门,如何系统的学习前端?
  6. asterisk php agi,asterisk AMI入门
  7. 关于同网段内主机之间通信细节
  8. 如何构建大数据分析平台
  9. Linux驱动的ioctl函数简要说明
  10. 【OpenCV入门教程之六】 创建Trackbar 图像对比度、亮度值调整(转)
  11. lintcode刷题——左叶子的和
  12. python中的token是什么
  13. springboot-单文件多文件下载Zip
  14. C#操作dxf文件修改和绘制线、标签、块元素
  15. centos漏洞系列(三):Google Android libnl权限提升漏洞
  16. E4A第一期-E4A的简单用法
  17. 安卓手机可以拍摄证件照吗
  18. 智联“焊”界,数字未来
  19. Hackshanghai 黑马
  20. 眼球追踪技术在用户体验中的应用

热门文章

  1. 【Android】Activity的四种launchMode
  2. Linux图片的灰度化,iOS图像灰度解决方案--架构设计
  3. mysql从oracle取数_Oracle通过过程定期取数
  4. java 过滤文件名_Java FileNameFilter过滤文件名
  5. docker harbor 域名_超详细的搭建docker私服Harbor教程
  6. tif文件转pdf_PPT怎么转换成PDF文件?可以帮到你的PPT转PDF方法
  7. mac m1上运行jenkins
  8. 三角形最小路径和—leetcode120
  9. WinDbg实战调试命令笔记
  10. 第八章 PX4-SDlog解析