Android AudioManager探索

AudioManager不陌生吧,你要设置音量、静音都要用到它,有时会遇到两个应用的音频重叠播放,就是因为没做好处理。。。

一、常用方法

初始化:

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

AudioManager声音的模式(streamType)如下:

AudioManager.STREAM_MUSIC      	 	媒体声音
AudioManager.STREAM_VOICE_CALL     	通话声音
AudioManager.STREAM_SYSTEM          系统声音
AudioManager.STREAM_RING            电话铃声
AudioManager.STREAM_ALARM           闹钟声音
AudioManager.STREAM_NOTIFICATION    通知声音
AudioManager.STREAM_BLUETOOTH_SCO   蓝牙链接声音

AudioManager的附加参数flags如下:

AudioManager.FLAG_SHOW_UI 		调整时显示音量条(就是按音量键出现的那个)
AudioManager.FLAG_PLAY_SOUND	改变音量时播放声音
AudioManager.FLAG_VIBRATE		手机铃声进入振动铃声模式是否振动
AudioManager.FLAG_ALLOW_RINGER_MODES	更改音量时是否切换模式,比如响铃音量设置为0时是否开启震动模式
AudioManager.FLAG_SHOW_SILENT_HINT	由于静音模式,无法调整音量,请在用户界面中显示提示。
AudioManager.FLAG_ACTIVE_MEDIA_ONLY	指示仅当媒体正在活动播放时才应处理此问题。
AudioManager.FLAG_SHOW_UI_WARNINGS	就像FLAG_SHOW_UI,但是只有对话框警告和确认,没有滑块。
AudioManager.FLAG_SHOW_VIBRATE_HINT 阻止将音量从振动调低,在用户界面中显示提示。

AudioManager的direction解释:

AudioManager.ADJUST_RAISE	增加铃声音量
AudioManager.ADJUST_LOWER	减小铃声音量。
AudioManager.ADJUST_MUTE	静音
AudioManager.ADJUST_UNMUTE	取消静音

1、 音量

1.1、获取当前streamType的音量

getStreamVolume(int streamType);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC

1.2、获取当前streamType的最大音量值

getStreamMaxVolume(int streamType);
参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC

1.3、设置当前streamType的音量值

设置方法一、直接设置当前音量值
setStreamVolume(int streamType, int index, int flags);

参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
参数index:音量值
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))

设置方法二、渐进式设置音量值(类似按物理音量键一步一步到指定值)
adjustStreamVolume(int streamType, int direction, int flags);

参数streamType:参考AudioManager的声音模式如:AudioManager.STREAM_MUSIC
参数direction:参考direction解释:如AudioManager.ADJUST_LOWER
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))

设置方法三、渐进式设置音量值
adjustVolume(int direction, int flags);

参数direction:参考direction解释:如AudioManager.ADJUST_LOWER
参数flags:附加参数如AudioManager.FLAG_SHOW_UI (调整时显示音量条(就是按音量键出现的那个))

2、获取焦点(处理声音重叠问题)

requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)
参数l:焦点切换监听
参数streamType:参考AudioManager的streamType模式如:AudioManager.STREAM_MUSIC
参数durationHint:参考如下

durationHint参数:

AudioManager.AUDIOFOCUS_NONE	用于指示未获得或丢失音频焦点或请求音频焦点。
AudioManager.AUDIOFOCUS_GAIN	(效果:重叠播放效果)用于指示未知持续时间的音频聚焦增益或音频聚焦请求。	
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT	(效果:播放时其他暂停,释放后其他继续播放)用于表示暂时获得或请求音频焦点
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK	(效果:类似导航播报,原声音弱化,释放后恢复)用于表示暂时的音频焦点请求,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE	(效果:播放时其他暂停,释放后其他继续播放)独占和瞬时音频焦点请求的示例是语音备忘录记录和语音识别,在此期间系统不应播放任何通知和媒体播放应该已暂停
AudioManager.AUDIOFOCUS_LOSS	(效果:获取焦点失败,没测出效果)用于指示持续时间未知的音频焦点丢失。
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT	(效果:获取焦点失败,没测出效果)用于指示音频焦点暂时丢失。
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK	(效果:获取焦点失败,没测出效果)用于指示音频焦点的丢失者可以如果要继续播放(也称为“回避”),请降低输出音量新的焦点所有者不要求其他人保持沉默。

二、代码示例

1、是否有媒体声音在播放(也可以处理声音重叠问题的产生)

 	/**
     * Android中判断是否有音频声音在播放(其他第三方应用)
     *
     * @return
     */
    private boolean isFmActive() {
        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if (am == null) {
            return false;
        }
        return am.isMusicActive();
    }

2、强制获取媒体焦点如:正在播放音乐,导航播报,音乐声音弱化或者直接停止,播报结束释放焦点自动播放原音乐

 	/**
     * 强制获取播放焦点
     */
    private void focusRequestAudio() {
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if (mAudioManager != null) {
            // Request audio focus for playback 结束记得释放abandonAudioFocus
            int result = mAudioManager.requestAudioFocus(audioFocusChangeListener,
                    STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
            //A successful focus change request.
            if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                //播放自己的音频
            } else {
                //A failed focus change request.获取焦点失败
                Log.e("snow", "=testDemo==获取焦点失败====");
            }
        }
    }
     AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {//不知为什么只调用了一次
            Log.e("snow", "=testDemo==focusChange====" + focusChange);
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放声音的焦点
        if (mAudioManager != null) {
            mAudioManager.abandonAudioFocus(audioFocusChangeListener);
        }
    }

3、静音模式

 	/**
     * 静音模式
     */
    public void silent() {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    }

4、震动模式

   /**
     * 震动模式
     */
    public void vibrate() {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
    }

5、正常模式

    /**
     * 正常模式
     */
    public void normal() {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
    }

6、获取铃声模式

  	/**
     * 获取铃声模式
     */
    public void getRingerMode() {
        mAudioManager.getRingerMode();
    }

7、获取音频模式

 	/**
     * 获取音频模式
     */
    public void getAudioMode() {
        mAudioManager.getMode();
    }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值