android AudioManager音频控件

a、通过系统服务获得声音管理器:

AudioManager audioManager =  (AudioManager)getSystemService(Service.AUDIO_SERVICE);

b、根据实际需要调用适当的方法:(常用方法)

audioManager.adjustStreamVolume(int streamType, int  direction, int flags);

streamType:声音类型,可取的为STREAM_VOICE_CALL(打电话时的声音), STREAM_SYSTEM(Android系统声音), STREAM_RING(电话铃响), STREAM_MUSIC(音乐声音) or STREAM_ALARM(警告声音)。

direction:调整音量的方向,可取为ADJUST_LOWER(调低音量), ADJUST_RAISE(调高音量), or ADJUST_SAME(保持先前音量)。

flags:可选标志位(如要显示出音量调节UI,使用如下flag:AudioManager.FLAG_SHOW_UI)。

audioManager.setStreamMute(int streamType, boolean state);设置指定声音类型(streamType)是否为静音。如果state为true,则设置为静音;否则,不设置为静音。

audioManager.setRingerMode(int ringerMode);

设置铃音模式,可取值为RINGER_MODE_NORMAL(铃音正常模式), RINGER_MODE_SILENT(铃音静音模式), or RINGER_MODE_VIBRATE(铃音震动模式,即铃音为静音,启动震动)。

audioManager.setMode(int mode);

设置声音模式,可取值为MODE_NORMAL(正常模式,即在没有铃音与电话的情况), MODE_RINGTONE(铃响模式), MODE_IN_CALL(接通电话模式) or MODE_IN_COMMUNICATION(通话模式)。

注意:声音的调节是没有权限要求的。


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

1、渐进式 

[html] view plain copy print ?
  1. public void adjustStreamVolume (int streamType, int direction, int flags)     
  2.     
  3. am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);    

解释一下三个参数

  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. 第二个direction,是调整的方向,增加或减少,可以是:
  10. ADJUST_LOWER 降低音量
  11. ADJUST_RAISE 升高音量
  12. ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量

  13. 第三个flags是一些附加参数,只介绍两个常用的
  14. FLAG_PLAY_SOUND 调整音量时播放声音
  15. FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个

2、直接设置音量值的方法: 

[html] view plain copy print ?
  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)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.



如何设置android的扬声器的开启状态?

A:
只能在MODE_IN_CALL模式下设置Speakerphone(扩音器)的开启状态

步骤1:
AndroidMainfest.xml中添加权限:android.permission.MODIFY_AUDIO_SETTINGS

步骤2:
设置扬声器开启或关闭
AudioManager audioManager = (AudioManager)mActivity.getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

检测扬声器是否开启
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
boolean isSpeakphoneOn = audioManager.isSpeakerphoneOn();

注意当不需要时一定要将音频模式设置回MODE_NORMAL(普通状态)
AudioManager audioManager = (AudioManager)mActivity.getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_NORMAL);


setSpeakerphone(true)方法的实现

setSpeakerphoneOn(true),看看实现。

这次我没再浪费时间了,我用一个新的工具coolfind,把搜索framework目录,寻找*.java文件,匹配字符串setSpeakerphone。终于,我在

framework/base/media/java/android/media/AudioService.java中找到了。

public void setSpeakerphoneOn(boolean on){

        if (!checkAudioSettingsPermission("setSpeakerphoneOn()")) {

            return;

        }

        if (on) {

//看到这里,是不是明白十之八九了?下面这个调用是:

//强制通话使用speaker!原来是这么个意思!

            AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION,

AudioSystem.FORCE_SPEAKER);

            mForcedUseForComm = AudioSystem.FORCE_SPEAKER;

        } else {

            AudioSystem.setForceUse(AudioSystem.FOR_COMMUNICATION,

AudioSystem.FORCE_NONE);

            mForcedUseForComm = AudioSystem.FORCE_NONE;

        }

    }



获取当前正在播放音频的硬件信息

使用不同的硬件设备可能会影响您应用程序的设计方式,您可以通过 AudioManager 来查询当前正在播放音频的硬件设备信息,是内置扬声器,还是有线耳机,或者是蓝牙设备。

  
  
  
  
  1. if (isBluetoothA2dpOn()) { 
  2.    // Adjust output for Bluetooth. 蓝牙设备 
  3. else if (isSpeakerphoneOn()) { 
  4.    // Adjust output for Speakerphone. 内置扬声器(免提) 
  5. else if (isWiredHeadsetOn()) { 
  6.    // Adjust output for headsets 有线耳机 
  7. else { 
  8.    // If audio plays and noone can hear it, is it still playing? 未知设备

Android音乐编程:管理音频焦点与音频焦点的获取,丢失焦点监听

http://mobile.51cto.com/android-309321.htm


Android音乐编程的管理音频硬件  如:当耳机线脱落,蓝牙设备断开,音频输出流会自动切换到内置扬声器

http://mobile.51cto.com/android-309371.htm


你可能感兴趣的:(android AudioManager音频控件)