android音量知识总结

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

Android中有如下几种音频流:

•AudioManager.STREAM_MUSIC /** The audio stream for music playback */
•AudioManager.STREAM_RING /** The audio stream for the phone ring */
•AudioManager.STREAM_ALARM /** The audio stream for alarms */
•AudioManager.STREAM_NOTIFICATION /** The audio stream for notifications */
•AudioManager.STREAM_SYSTEM /** The audio stream for system sounds */
•AudioManager.STREAM_VOICECALL /** The audio stream for phone calls */

setVolumeControlStream函数描述:

void android.app.Activity .setVolumeControlStream(int streamType)
Suggests an audio stream whose volume should be changed by the hardware volume controls.

The suggested audio stream will be tied to the window of this Activity. If the Activity is switched, the stream set here is no longer the suggested stream. The client does not need to save and restore the old suggested stream value in onPause and onResume.

Parameters:
streamType The type of the audio stream whose volume should be changed by the hardware volume controls. It is not guaranteed that the hardware volume controls will always change this stream‘s volume (for example, if a call is in progress, its stream‘s volume may be changed instead). To reset back to the default, use AudioManager.USE_DEFAULT_STREAM_TYPE .

/////////////////

Android中有如下几种音频流(streamType是需要调整音量的类型):

* AudioManager.STREAM_MUSIC  /音乐回放即媒体音量/
    * AudioManager.STREAM_RING /铃声/
    * AudioManager.STREAM_ALARM  /警报/
    * AudioManager.STREAM_NOTIFICATION /窗口顶部状态栏通知声/
    * AudioManager.STREAM_SYSTEM  /系统/
    * AudioManager.STREAM_VOICECALL /通话 /
    * AudioManager.STREAM_DTMF /双音多频,不是很明白什么东西 /

AudioManager可以修改系统Android系统的音量,下面介绍几个AudioManager的几个音量调整方面的方法.
首先是得到AudioManager实例:
Java代码  收藏代码

1. AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

调整音量方法有两种,一种是渐进式,即像手动按音量键一样,一步一步增加或减少,另一种是直接设置音量值.
1、渐进式
Java代码  收藏代码

1. public void adjustStreamVolume (int streamType, int direction, int flags)  
   2.   
   3. am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);

解释一下三个参数

Java代码  收藏代码

1. 第一个streamType是需要调整音量的类型,这里设的是媒体音量,可以是:  
   2. STREAM_ALARM 警报  
   3. STREAM_MUSIC 音乐回放即媒体音量  
   4. STREAM_NOTIFICATION 窗口顶部状态栏Notification,  
   5. STREAM_RING 铃声  
   6. STREAM_SYSTEM 系统  
   7. STREAM_VOICE_CALL 通话  
   8. STREAM_DTMF 双音多频,不是很明白什么东西  
   9.   
  10. 第二个direction,是调整的方向,增加或减少,可以是:  
  11. ADJUST_LOWER 降低音量  
  12. ADJUST_RAISE 升高音量  
  13. ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量  
  14.   
  15. 第三个flags是一些附加参数,只介绍两个常用的  
  16. FLAG_PLAY_SOUND 调整音量时播放声音  
  17. FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个  
  18. 0 表示什么也没有

2、直接设置音量值的方法:
Java代码  收藏代码

1. public void setStreamVolume (int streamType, int index, int flags)  
   2.   
   3. am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND);  
   4. am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的最大值  
   5. am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的当前值

第一个和第三个参数与上面的相同
第二个参数是一个音量的int值,getStreamMaxVolume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.

//////////////////////////

AudioManager类位于android.Media 包中,该类提供访问控制音量和钤声模式的操作。

官方文档中注明了:Use Context.getSystemService(Context.AUDIO_SERVICE) to get an instance of this class.

所以我们可以通过下面的语句获得:

[java] view plaincopyprint?

1. AudioManager audiomanage = (AudioManager)getAcitivity().getSystemService(Context.AUDIO_SERVICE);

AudioManager audiomanage = (AudioManager)getAcitivity().getSystemService(Context.AUDIO_SERVICE);

audiomanager就是我们定义的控制系统声音的对象。

这里只讲述几个比较常用到的方法:

adjustVolume(int direction, int flags)

用来控制手机音量大小,

当传入的第一个参数为AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,

传入AudioManager.ADJUST_RAISE时,则可以将音量调大一个单位。

adjustStreamVolume(int streamType, int direction, intflags)

(以步长)调节手机音量大小
参数1:声音类型,可取为STREAM_VOICE_CALL(通话)、STREAM_SYSTEM(系统声音)、STREAM_RING(铃声)、STREAM_MUSIC(音乐)、STREAM_ALARM(闹铃声)
参数2:调整音量的方向,可取ADJUST_LOWER(降低)、ADJUST_RAISE(升高)、ADJUST_SAME
参数3:可选的标志位

setStreamVolume(int streamType, int index, intflags)

直接设置音量大小

getMode()

返回当前音频模式,如 NORMAL(普通), RINGTONE(铃声), orIN_CALL(通话)

setMode()

设置声音模式,可取值NORMAL(普通), RINGTONE(铃声), or IN_CALL(通话)

getRingerMode()

返回当前的铃声模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(静音)、RINGER_MODE_VIBRATE(震动)

setRingerMode(int ringerMode)

改变铃声模式

getStreamVolume(int streamType)

取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。

getStreamMaxVolume(int streamType)

获得当前手机最大铃声。

setStreamMute(int streamType, boolean state)
静音或不静音音频流
设置指定声音类型(streamType)是否为静音。如果state为true,则设置为静音;否则,不设置为静音。
[java] view plaincopyprint?

1. //音量控制,初始化定义  
   2.   
   3. AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
   4. //最大音量  
   5. int maxVolume =mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);  
   6. //当前音量  
   7. int currentVolume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

//音量控制,初始化定义

AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//最大音量
int maxVolume =mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int currentVolume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

直接控制音量的多少:
[java] view plaincopyprint?

1. if(isSilent){  
   2.   mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0, 0);  
   3. }else{  
   4.   mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,tempVolume, 0);//tempVolume:音量绝对值  
   5. }

if(isSilent){
  mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0, 0);
}else{
  mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,tempVolume, 0);//tempVolume:音量绝对值
}

以一步步长控制音量的增减,并弹出系统默认音量控制条:
[java] view plaincopyprint?

1. //降低音量,调出系统音量控制  
   2. if(flag ==0){  
   3.   mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,  
   4.                             AudioManager.FX_FOCUS_NAVIGATION_UP);  
   5. }  
   6. //增加音量,调出系统音量控制  
   7. else if(flag ==1){  
   8.   mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,  
   9.                             AudioManager.FX_FOCUS_NAVIGATION_UP);  
  10. }

//降低音量,调出系统音量控制
if(flag ==0){
  mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,
                            AudioManager.FX_FOCUS_NAVIGATION_UP);
}
//增加音量,调出系统音量控制
else if(flag ==1){
  mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,
                            AudioManager.FX_FOCUS_NAVIGATION_UP);
}

常用方法:
android audioManager获取音量:
先获取AudioManager实例,
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

[java] view plaincopyprint?

1. //通话音量  
   2.   
   3. int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL );   
   4.   
   5. int current = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL );   
   6.   
   7. //系统音量  
   8.   
   9. int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM );   
  10.   
  11. current = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM );   
  12.   
  13. //铃声音量  
  14.   
  15. max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING);   
  16.   
  17. current = mAudioManager.getStreamVolume(AudioManager.STREAM_RING );   
  18.   
  19. //音乐音量  
  20.   
  21. max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC );   
  22.   
  23. current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC );   
  24.   
  25.   
  26.   
  27. //提示声音音量  
  28.   
  29. max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM );   
  30.   
  31. current = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM );

时间: 2024-10-07 13:23:55

android音量知识总结的相关文章

android基础知识

1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大提升. Ÿ 第四代移动通信技术(4th - Generation),速度可达到100Mbps以上,几乎可以满足人们的所有传输数据的需求. Ÿ 目前主流的3G技术标准有三种: WCDMA:全球80%以上的3G网络都是采用此种制式.中国联通运营.186 CDMA2000:目前日韩及北美使用较多.中国电信运营. 189 TD-SCDMA

Android基础知识(6)—数据持久化之数据存储

阅读前,请浏览此处上方目录. Android基础知识(6)-数据持久化之数据存储 本章内容为个人笔记,参考书籍有:<疯狂的android>第3版.<第一行代码> 首先,我们要知道什么是数据持久化. 数据持久化就是指那些内存中的瞬时数据保存到存储设备中,保证即使手机在关机的情况下,这些数据不会丢失.保存在内存中的数据是处于瞬时状态,保存在存储设备中的数据是处于持久状态.持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换. Android系统主要提供了三种方式用于简

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

Android JNI知识简介

Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C.C++ 和汇编语言)编写的应用程序和库进行交互操作. 1.从如何载入.so档案谈起 由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)

Android基础知识【项目实训】【1】

[该项目实训是Android基础知识的一个综合练习] [项目题目]:校园订餐App设计 综合案例 [设计目标] 1.必要功能 ?快餐店浏览,与订餐 ?今天订餐活动查询与订餐,特价饭菜预定 ?分类订餐查询,预定 ?常定饭菜  预定 ?健康餐推荐 ?定时预定,提前预定 ?订单查看, ?餐馆与饭菜打分,评价 ?用户注册与登录 2.扩展选择功能 ?快速拨打电话 ?饮食跟踪,热量估算 ?系统设置 [项目说明] 该项目为实际应用项目的单机 简化版本,只需要完成Android平台App的设计与开发工作. Ap

Android基础知识【项目实训】【2】

[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 综合案例 [目标] 因为项目只涉及基础知识,因此项目中所用数据并不联网,都读取单机数据库.(即将该项目中所用数据,如菜品信息.店铺信息等存入数据库)用户在第一次打开该项目时,会在用户手机上创建这些数据库,并插入测试数据. 1.先制作一个欢迎界面,欢迎的同时,准备数据库 欢迎界面Activity对应

Android基础知识【项目实训】【3】

[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 综合案例 [目标] 欢迎界面过后,应该显示app的主界面了,根据[UI设计指导]中的规划,主界面采用上下两级标签导航.这部分是app开发中比较麻烦的一块. 1.先来看一下,最终的效果吧,这样做起来比较有底: 默认显示的主界面,下部是主导航,上面是二级导航,默认打开的是"促销打折"这一版面

Android基本知识

     Android是Google公司于2007年发布的基于Linux内核的手机操作系统.应用层主要以java为编程语言,应用层分为两层,函数层(Library) 和虚拟机(Virtual).中间层多以Java实现,采用自主开发的Dalvik虚拟机(基于寄存器的Java虚拟机,传统的为基于堆栈),输入Java字节码,Dalvik虚拟机使用的为dex格式的输入文件,而不是传统的字节码class文件.      下图为Android系统框架           整个Android系统从上往下分为

Android基础知识【项目实训】【4】

[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 综合案例 [目标] 主界面的功能确实比较复杂,因此上一篇知识说的周边内容.现在开始说这个界面的代码和布局文件. 1.先看一下项目的组织结构吧,要不然不好说他们的关系: (1)db包中的都是跟 数据库相关的 (2)eatall中放的都是activity或者fragment (3)entity中放的实