0. Thanks To

Android音量控制调节
android 音量控制setVolumeControlStream
android 音量调节以及媒体音量界面

1. 音量调节

我们知道,在平常调节音量的时候,是有一定的调节数值,
也就是,每按一次音量+/-,音量的增加/减小幅度,这个我们称为:系统的音量步进值。
而,音量还有一定的范围,系统的是:0到Max,Max不确定,这个称为:系统的音量范围。

在Android中,是有几种类型的音量可以调节:

  • STREAM_ALARM 警报
  • STREAM_MUSIC 音乐回放即媒体音量
  • STREAM_RING 铃声
  • STREAM_SYSTEM 系统
  • STREAM_VOICE_CALL 通话

Android中的所有音量都是通过:AudioManager 去管理的,也是通过它去调节:

    //获取系统的Audio管理者AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);  //最大音量int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//当前音量int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

而,日常的项目中,有两种的调节方式:

  • 1.渐进式,即像手动按音量键一样,一步一步增加或减少:
    通过AudioManager的adjustStreamVolume方法
public void adjustStreamVolume (int  streamType, int direction, int flags)
参数说明:int streamType  需要调整的音量类型(以下常量定义于AudioManager类中)STREAM_ALARM 警报STREAM_MUSIC 音乐回放即媒体音量STREAM_NOTIFICATION 窗口顶部状态栏Notification,STREAM_RING 铃声STREAM_SYSTEM 系统STREAM_VOICE_CALL 通话STREAM_DTMF 双音多频,不是很明白什么东西int direction   调整的方向,加或者减。(以下常量定义于AudioManager类中)ADJUST_LOWER 降低音量ADJUST_RAISE 升高音量ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量int flags   附加的一些参数参数的说明参考API文档:http://www.android-doc.com/reference/android/media/AudioManager.htmlFLAG_PLAY_SOUND 调整音量时播放声音FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个0表示什么也没有
  • 2.直接自定义调节的幅度(步进值),直接调节音量大小。
public void setStreamVolume (int streamType, int index, int flags)参数说明:第一个,第三个和上面的一样第二个参数:int index: 把音量调整到index值。这里,可以根据获取的最大音量去自己设置调整的幅度。

2. 音量按键的监听

直接上代码,需要在Activity中,重写其按键的回调:

    @Overridepublic boolean dispatchKeyEvent(KeyEvent event) {int action = event.getAction();if (action ==KeyEvent.ACTION_DOWN) {tv.setText("+++++++++ACTION_DOWN++++++"+ count++);return true;}if (action== KeyEvent.ACTION_UP) {tv.setText("+++++ACTION_UP++++++++++");return true;}return super.dispatchKeyEvent(event);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_VOLUME_DOWN:tv.setText("-----------------"+count);count--;return true;case KeyEvent.KEYCODE_VOLUME_UP:tv.setText("++++++++++++++++"+ count);count++;return true;case KeyEvent.KEYCODE_VOLUME_MUTE:tv.setText("MUTE");return true;}return super.onKeyDown(keyCode, event);}

两个方法选其一就好。

3. UI修改:

我们可以直接在监听里面做,让系统音量UI不弹出,设置好调整音量的两个方法的FLAG就好,然后自己去控制音量。
这里我们可以用自定义的Toast布局去弄,或者是基于Dialog的组合控件去曾现这个音量条。

4. 封装音量控制:

代码里面定义了常用的DIY音量调节范围:0-100,默认音量步进值为2。

package com.chestnut.Common.Helper;import android.content.Context;
import android.media.AudioManager;
import android.support.annotation.IntDef;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;/*** <pre>*     author: Chestnut*     blog  : http://www.jianshu.com/u/a0206b5f4526*     time  : 2017/6/17 16:11*     desc  :  集成音量控制*     thanks To:   http://blog.csdn.net/hufeng882412/article/details/7310131*     dependent on:*     update log:* </pre>*/public class AudioMngHelper {private final String TAG = "AudioMngHelper";private final boolean OpenLog = true;private AudioManager audioManager;private int NOW_AUDIO_TYPE = TYPE_MUSIC;private int NOW_FLAG = FLAG_NOTHING;private int VOICE_STEP_100 = 2; //0-100的步进。/*** 封装:STREAM_类型*/public final static int TYPE_MUSIC = AudioManager.STREAM_MUSIC;public final static int TYPE_ALARM = AudioManager.STREAM_ALARM;public final static int TYPE_RING = AudioManager.STREAM_RING;@IntDef({TYPE_MUSIC, TYPE_ALARM, TYPE_RING})@Retention(RetentionPolicy.SOURCE)public @interface TYPE {}/*** 封装:FLAG*/public final static int FLAG_SHOW_UI = AudioManager.FLAG_SHOW_UI;public final static int FLAG_PLAY_SOUND = AudioManager.FLAG_PLAY_SOUND;public final static int FLAG_NOTHING = 0;@IntDef({FLAG_SHOW_UI, FLAG_PLAY_SOUND, FLAG_NOTHING})@Retention(RetentionPolicy.SOURCE)public @interface FLAG {}/*** 初始化,获取音量管理者* @param context   上下文*/public AudioMngHelper(Context context) {audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);}public int getSystemMaxVolume() {return audioManager.getStreamMaxVolume(NOW_AUDIO_TYPE);}public int getSystemCurrentVolume() {return audioManager.getStreamVolume(NOW_AUDIO_TYPE);}/*** 以0-100为范围,获取当前的音量值* @return  获取当前的音量值*/public int get100CurrentVolume() {return 100*getSystemCurrentVolume()/getSystemMaxVolume();}/*** 修改步进值* @param step  step* @return  this*/public AudioMngHelper setVoiceStep100(int step) {VOICE_STEP_100 = step;return this;}/*** 改变当前的模式,对全局API生效* @param type* @return*/public AudioMngHelper setAudioType(@TYPE int type) {NOW_AUDIO_TYPE = type;return this;}/*** 改变当前FLAG,对全局API生效* @param flag* @return*/public AudioMngHelper setFlag(@FLAG int flag) {NOW_FLAG = flag;return this;}public AudioMngHelper addVoiceSystem() {audioManager.adjustStreamVolume(NOW_AUDIO_TYPE,AudioManager.ADJUST_RAISE,NOW_FLAG);return this;}public AudioMngHelper subVoiceSystem() {audioManager.adjustStreamVolume(NOW_AUDIO_TYPE,AudioManager.ADJUST_LOWER,NOW_FLAG);return this;}/*** 调整音量,自定义* @param num   0-100* @return  改完后的音量值*/public int setVoice100(int num) {int a = (int) Math.ceil((num)*getSystemMaxVolume()*0.01);a = a<=0 ? 0 : a;a = a>=100 ? 100 : a;audioManager.setStreamVolume(NOW_AUDIO_TYPE,a,0);return get100CurrentVolume();}/*** 步进加,步进值可修改*  0——100* @return  改完后的音量值*/public int addVoice100() {int a = (int) Math.ceil((VOICE_STEP_100 + get100CurrentVolume())*getSystemMaxVolume()*0.01);a = a<=0 ? 0 : a;a = a>=100 ? 100 : a;audioManager.setStreamVolume(NOW_AUDIO_TYPE,a,NOW_FLAG);return get100CurrentVolume();}/*** 步进减,步进值可修改*  0——100* @return  改完后的音量值*/public int subVoice100() {int a = (int) Math.floor((get100CurrentVolume() - VOICE_STEP_100)*getSystemMaxVolume()*0.01);a = a<=0 ? 0 : a;a = a>=100 ? 100 : a;audioManager.setStreamVolume(NOW_AUDIO_TYPE,a,NOW_FLAG);return get100CurrentVolume();}
}

部分API的说明:

  • 可以设置对哪种类型的音量去调控,通过:AudioMngHelper.setAudioType,通过注解的方式限制了用户的设置类型,在类的开头可以看到,默认值是媒体类型。

  • 可以对Flag进行全局的设置,通过:AudioMngHelper.setFlag,设置显示UI或者听到调节音效或者啥都没。

  • get100CurrentVolume():以0-100为范围,获取当前的音量值

  • getSystemMaxVolume():获取系统音量范围的最大值

  • getSystemCurrentVolume():获取系统音量范围的当前值

  • addVoiceSystem():以系统步进值和范围为基础,音量+

  • subVoiceSystem():同上,音量-

  • addVoice100():以0-100范围和自定义的步进值为基础,音量+

  • subVoice100():同上,音量-

  • setVoiceStep100():设置DIY步进值,默认是2。

5. Demo

这个Demo示例了怎么使用这个封装,和示例了怎么修改音量调UI。
ChestnutPlus/ModuleMedia
代码在:Moudle-Media-src-java下
通过MainActivity调用VideoActivity,记得修改视频的URL。

 /*** 监听音量实体按键* @param keyCode* @param event* @return*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {int a;switch (keyCode) {case KeyEvent.KEYCODE_VOLUME_DOWN:xToastMusic.setVoice(audioMngHelper.subVoice100()).show();return true;case KeyEvent.KEYCODE_VOLUME_UP:xToastMusic.setVoice(audioMngHelper.addVoice100()).show();return true;case KeyEvent.KEYCODE_VOLUME_MUTE:break;}return super.onKeyDown(keyCode, event);}

Android音量控制相关推荐

  1. Android音量控制曲线

    摘要:本文介绍了android音量的控制曲线的计算方法. 由于人耳对声音的听感具指数曲线型,也就是对小音量时比较敏感,随着声音的加大其听感随之变的不敏感,其变化近似指数函数曲线的形式.为了使听感变的近 ...

  2. Android 音量控制流程分析

    在Android平台上,音量键,主页键(home),都是全局按键,但是主页键是个例外不能被应用所捕获.下面分析一下音量按键的流程,主要从framework层处理开始,至于 EventHub 从驱动的/ ...

  3. Android音量控制调节

    //音量控制,初始化定义 AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // ...

  4. android音量控制setVolumeControlStream

    当开发多媒体应用或者游戏应用的时候,需要使用音量控制键来设置程序的音量大小.在Android系统中有多中音频流,通过Activity中的函数setVolumeControlStream(int str ...

  5. RK3568平台开发系列讲解(音频篇)Android音量控制流程

  6. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  7. 音效管理android,Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  8. Android系统的音量控制

    Android系统的音量控制 效果图: GitHub GitHub(源码):https://github.com/kongqw/VolumeController 方法 获取AudioManager m ...

  9. Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

最新文章

  1. node 常用指令 node 扩展链接
  2. R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法、data.table、dplyr等方案、计算滑动分组统计
  3. MonkeyRunner在Windows下的Eclipse开发环境搭建步骤(兼解决网上Jython配置出错的问题)...
  4. 将十六进制的字符串转化为UIImage
  5. 全面支持开源,微软加速 Visual Studio 和 Azure DevOps 云升级
  6. 应用服务器——JBoss架构分析
  7. yocto rootfs 支持pam
  8. 四、RabbitMQ消息消费时的权衡
  9. Bailian4071 查找出现了k次的字符【字符串】
  10. cc2530定时器和捕获比较_STM32学习笔记07—基础定时器实验
  11. 求数列的最大子段和java_十大经典排序算法(Java版本)
  12. python吃鸡透视_绝地求生仅需这个设置!让你的电脑自带透视!吃鸡到手软
  13. matlab实现Sobel边缘检测
  14. 魔兽是用Python开发的,一起看看Python开发的知名网站和游戏!
  15. Wing IDE安装与破解方法
  16. 【skills】sublime text 3 自定义 修改 颜色主题 配色方案
  17. Job-shop和Flow-shop区别
  18. HUAWEI华为笔记本电脑MateBook 13(WRTB-WFE9L)原装出厂系统恢复原厂系统
  19. 安保巡更室内外定位系统解决方案
  20. 51nod (2534,dp)

热门文章

  1. STC单片机 VS/HX1838红外接收和发送实验
  2. 解决Altium Designer许可(license)授权紧张的问题
  3. oracle 列转行sql函数
  4. 【XBEE手册】XBEE操作
  5. Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven...
  6. 各类VRP问题标准算例资源汇总
  7. H5-脱机API-Application Cache-1.1
  8. java之ResourceBundle类详细分析(全)
  9. 【QT线程实现扫描IP和端口】
  10. 京东2019年春暑期实习笔试