android 音量调节不起作用,Android音量控制
0. Thanks To
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.html
FLAG_PLAY_SOUND 调整音量时播放声音
FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个
0表示什么也没有
2.直接自定义调节的幅度(步进值),直接调节音量大小。
public void setStreamVolume (int streamType, int index, int flags)
参数说明:
第一个,第三个和上面的一样
第二个参数:
int index: 把音量调整到index值。
这里,可以根据获取的最大音量去自己设置调整的幅度。
2. 音量按键的监听
直接上代码,需要在Activity中,重写其按键的回调:
@Override
public 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);
}
@Override
public 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;
/**
*
* 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:
*
*/
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
*/
@Override
public 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 音量调节不起作用,Android音量控制相关推荐
- android 音量调节不起作用,Android开发之调整手机音量
调整手机的各种音量可以通过AudioManager这个类来操作 注:安卓手机各种音量的最大数值不一样,请通过下面具体的方法获取最大音量值. 涉及的参数说明: streamType类型:(音量类型) S ...
- android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug
其实这文章有点傻逼. 相关的问题 TextView android:ellipsize="end"超出一个字符时不显示-的解决 http://www.pocketdigi.com/ ...
- 去掉Android中的耳机音量调节到最大时候的音量检查
问题背景: Android R Automotive版本开发车机过程中,想要实现多通路音频输出,正常选择了一个通路对应speaker这个output device,另外一个通路选择了wired hea ...
- android 音量调节框,「Best Volume Widget」手机桌面独立音量调节小工具 (Android)...
智能型手机的音量控制工具,通常都埋在设置菜单的「音效」中,每每需要时至少得点击四次才能进入调整音量,当然也可以直接按手机的实体音量控制键,不过要是在原本就安静的环境下想玩个游戏或看个影片,先将媒体音量 ...
- android wms各个类的作用,Android系统服务 —— WMS
"可以毫不夸张的说,Android的framework层主要是由WMS.AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对fr ...
- android 隐藏状态栏 不起作用,Android 状态栏的隐藏和显示
在Android应用中我们可能会碰到这样的需求,隐藏状态栏或者状态栏和应用背景一样的颜色,比如下图: 状态栏和背景一个颜色 Android应用程序的界面上系统元素构成如下图: 在4.1之后的系统,隐藏 ...
- android:ellipsize=end 不起作用,Android ellipsize 使用以及设置没有效果问题
一.ellipsize作用 设置当文字过长时,该控件该如何显示.有如下值设置: "start"-–省略号显示在开头: "end"--省略号显示在结尾: &quo ...
- android下raw目录的作用,Android 之 assets目录和raw目录
Android 中存在assets目录和raw目录,它们既有相似之处又有所不同. 一.共同点: 目录下的资源会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式. 二.区别 1. ...
- android 多语言不起作用,Android本地化语言环境不起作用,所有区域代码都存在问题...
我需要将除瑞士之类的子语言环境添加到我的应用程序中,而不是普通的德语. 我找到的德语资源文件夹的语言环境扩展名为de.所以我的文件夹名为"values-de".这很好. 然后我添加 ...
- Android中layout目录的作用,Android 开发中layout下的子文件夹
Android 开发中layout下的子文件夹 发布时间:2020-10-25 11:42:36 来源:脚本之家 阅读:71 作者:厚土火焰山 如果一个项目内有很多个界面,那么在layout下会有太多 ...
最新文章
- F# ≥ C# (Record)
- 虚拟机安装Ubuntu14.04打开FireFox提示Server not found
- jQuery的回调函数
- 三星Galaxy Note 20系列或将于8月5日发布
- 使用DM框架实现一个小的计算器
- 【原创】Extjs4 通用CURD方法
- 基于 props 更新 state
- Python版本微信跳一跳,软件配置
- lsb_release -a 查询Linux系统版本
- 第一次使用博客,略激动。
- MOT多目标跟踪之JDE
- Linux中ping脚本
- 根据MIDlet套件(Jar文件)自动生成jad文件
- 密西根州立大学计算机qs分数,美国密歇根州立大学在2021年QS世界排名上的名次是多少?...
- 华为防火墙-管理配置
- Qt编写自定义控件65-光晕日历
- 有趣的手机壁纸——水印壁纸
- Word中的字体大小(几号-几磅)【转】
- linux sed 目录递归,shell递归遍历目录下的所有文件并统一改名的方法-文件更名...
- 以下不属于计算机完成科学计算特点的是,2016年自考《计算机应用基础》精选习题五...
热门文章
- 数学之美:《社交网络》中Facemash算法分析
- Java源文件的编译运行
- P3110 [USACO14DEC]驮运Piggy Back
- 如何启用台式计算机无线开关,联想一体机无线网卡开关如何开启_怎么打开联想电脑一体机WiFi无线开关-win7之家...
- scala 定义空list_scala-03-list操作
- 基于GA遗传算法的TSP旅行商问题求解
- 个人网站建设流程攻略
- 巴菲特-芒格-彼得林奇的经典观点梳理
- android触摸 apk,超级触控(流畅触屏)apk
- SA的空间注意力和通道注意力