0. Thanks To
Android音量控制調(diào)節(jié)
android 音量控制setVolumeControlStream
android 音量調(diào)節(jié)以及媒體音量界面
1. 音量調(diào)節(jié)
我們知道遥诉,在平常調(diào)節(jié)音量的時(shí)候橡淑,是有一定的調(diào)節(jié)數(shù)值亏吝,
也就是炉抒,每按一次音量+/-,音量的增加/減小幅度世舰,這個(gè)我們稱為:系統(tǒng)的音量步進(jìn)值动雹。
而,音量還有一定的范圍跟压,系統(tǒng)的是:0到Max胰蝠,Max不確定,這個(gè)稱為:系統(tǒng)的音量范圍震蒋。
在Android中茸塞,是有幾種類(lèi)型的音量可以調(diào)節(jié):
- STREAM_ALARM 警報(bào)
- STREAM_MUSIC 音樂(lè)回放即媒體音量
- STREAM_RING 鈴聲
- STREAM_SYSTEM 系統(tǒng)
- STREAM_VOICE_CALL 通話
Android中的所有音量都是通過(guò):AudioManager 去管理的,也是通過(guò)它去調(diào)節(jié):
//獲取系統(tǒng)的Audio管理者
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
//最大音量
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//當(dāng)前音量
int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
而查剖,日常的項(xiàng)目中钾虐,有兩種的調(diào)節(jié)方式:
- 1.漸進(jìn)式,即像手動(dòng)按音量鍵一樣,一步一步增加或減少:
通過(guò)AudioManager的adjustStreamVolume方法
public void adjustStreamVolume (int streamType, int direction, int flags)
參數(shù)說(shuō)明:
int streamType 需要調(diào)整的音量類(lèi)型
(以下常量定義于AudioManager類(lèi)中)
STREAM_ALARM 警報(bào)
STREAM_MUSIC 音樂(lè)回放即媒體音量
STREAM_NOTIFICATION 窗口頂部狀態(tài)欄Notification,
STREAM_RING 鈴聲
STREAM_SYSTEM 系統(tǒng)
STREAM_VOICE_CALL 通話
STREAM_DTMF 雙音多頻,不是很明白什么東西
int direction 調(diào)整的方向,加或者減梗搅。
(以下常量定義于AudioManager類(lèi)中)
ADJUST_LOWER 降低音量
ADJUST_RAISE 升高音量
ADJUST_SAME 保持不變,這個(gè)主要用于向用戶展示當(dāng)前的音量
int flags 附加的一些參數(shù)
參數(shù)的說(shuō)明參考API文檔:http://www.android-doc.com/reference/android/media/AudioManager.html
FLAG_PLAY_SOUND 調(diào)整音量時(shí)播放聲音
FLAG_SHOW_UI 調(diào)整時(shí)顯示音量條,就是按音量鍵出現(xiàn)的那個(gè)
0表示什么也沒(méi)有
- 2.直接自定義調(diào)節(jié)的幅度(步進(jìn)值)禾唁,直接調(diào)節(jié)音量大小。
public void setStreamVolume (int streamType, int index, int flags)
參數(shù)說(shuō)明:
第一個(gè)无切,第三個(gè)和上面的一樣
第二個(gè)參數(shù):
int index: 把音量調(diào)整到index值。
這里丐枉,可以根據(jù)獲取的最大音量去自己設(shè)置調(diào)整的幅度哆键。
2. 音量按鍵的監(jiān)聽(tīng)
直接上代碼,需要在Activity中瘦锹,重寫(xiě)其按鍵的回調(diào):
@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);
}
兩個(gè)方法選其一就好籍嘹。
3. UI修改:
我們可以直接在監(jiān)聽(tīng)里面做闪盔,讓系統(tǒng)音量UI不彈出,設(shè)置好調(diào)整音量的兩個(gè)方法的FLAG就好辱士,然后自己去控制音量泪掀。
這里我們可以用自定義的Toast布局去弄,或者是基于Dialog的組合控件去曾現(xiàn)這個(gè)音量條颂碘。
4. 封裝音量控制:
代碼里面定義了常用的DIY音量調(diào)節(jié)范圍:0-100异赫,默認(rèn)音量步進(jìn)值為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.reibang.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的步進(jìn)头岔。
/**
* 封裝:STREAM_類(lèi)型
*/
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為范圍,獲取當(dāng)前的音量值
* @return 獲取當(dāng)前的音量值
*/
public int get100CurrentVolume() {
return 100*getSystemCurrentVolume()/getSystemMaxVolume();
}
/**
* 修改步進(jìn)值
* @param step step
* @return this
*/
public AudioMngHelper setVoiceStep100(int step) {
VOICE_STEP_100 = step;
return this;
}
/**
* 改變當(dāng)前的模式峡竣,對(duì)全局API生效
* @param type
* @return
*/
public AudioMngHelper setAudioType(@TYPE int type) {
NOW_AUDIO_TYPE = type;
return this;
}
/**
* 改變當(dāng)前FLAG靠抑,對(duì)全局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;
}
/**
* 調(diào)整音量,自定義
* @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();
}
/**
* 步進(jìn)加适掰,步進(jìn)值可修改
* 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();
}
/**
* 步進(jìn)減颂碧,步進(jìn)值可修改
* 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的說(shuō)明:
可以設(shè)置對(duì)哪種類(lèi)型的音量去調(diào)控,通過(guò):AudioMngHelper.setAudioType类浪,通過(guò)注解的方式限制了用戶的設(shè)置類(lèi)型载城,在類(lèi)的開(kāi)頭可以看到,默認(rèn)值是媒體類(lèi)型戚宦。
可以對(duì)Flag進(jìn)行全局的設(shè)置个曙,通過(guò):AudioMngHelper.setFlag,設(shè)置顯示UI或者聽(tīng)到調(diào)節(jié)音效或者啥都沒(méi)受楼。
get100CurrentVolume():以0-100為范圍垦搬,獲取當(dāng)前的音量值
getSystemMaxVolume():獲取系統(tǒng)音量范圍的最大值
getSystemCurrentVolume():獲取系統(tǒng)音量范圍的當(dāng)前值
addVoiceSystem():以系統(tǒng)步進(jìn)值和范圍為基礎(chǔ),音量+
subVoiceSystem():同上艳汽,音量-
addVoice100():以0-100范圍和自定義的步進(jìn)值為基礎(chǔ)猴贰,音量+
subVoice100():同上,音量-
setVoiceStep100():設(shè)置DIY步進(jìn)值河狐,默認(rèn)是2米绕。
5. Demo
這個(gè)Demo示例了怎么使用這個(gè)封裝,和示例了怎么修改音量調(diào)UI馋艺。
ChestnutPlus/ModuleMedia
代碼在:Moudle-Media-src-java下
通過(guò)MainActivity調(diào)用VideoActivity,記得修改視頻的URL栅干。
/**
* 監(jiān)聽(tīng)音量實(shí)體按鍵
* @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);
}
點(diǎn)個(gè)贊咯~