Android音频管理之AudioManager(原创)

  • 时间:
  • 浏览:1
  • 来源:uu快3app_uu快3预测苹果

    super.onRestart();

            }else if (focusChange == AUDIOFOCUS_GAIN){

            }

进一步思考:

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

    public void onReceive(Context context, Intent intent) {

}

}

AudioManager,音频管理类,它主要提供了丰厚的API让开发者对应用的音量和铃声模式进行控制以及访问。主要内容涉及到音频流、声音、蓝牙、扩音器、耳机等等。

最后,对生命周期onRestart()办法上边,通过AudioManage设置音量即可

试想意味不有效的处里应用的音频,会再次老会 出现那先 情况?朋友在听歌的一起意味完会 听到啪啪啪的声音。(注:这里的啪啪啪指观看羽毛球视频)为了处里多个音乐播放应用一起播放音频,

    final String SYSTEM_DIALOG_REASON_KEY ="reason";

来获取音频焦点,这个 办法有另另一2个多参数,下面仔细分析下这另另一2个多参数

                AudioManager.AUDIOFOCUS_GAIN);

D:AUDIOFOCUS_GAIN 也如此 来越多如此 来越多焦点请求(这个 用的较多)

等等,具体的更丰厚更全面的API可不不还也能参考 AudioManager官方文档

事情的起因是另另另一2个多的,最近接到个需求WebView加载H5游戏,嗯,霹雳巴拉一顿猛敲基本上就拿出了,针对8.1系统也做了有些适配。好了,验货的时间到了,产品用他那傲娇的手指一顿操作后不耐烦的说,这个 应用为那先 按下HOME键后(Back键禁用了 - - !)游戏还有声音???当时我在想,目标Activity生命周期 onResume()和onPause()都不 写了对应的 myWebView.onResume();以及 myWebView.onPause()的啊啊!难不成那厮又在戏剧性耍我?

    private AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener(){

情况二:AudioManager.AUDIOFOCUS_LOSS

                }

                Log.i(TAG, "onAudioFocusChange: == AUDIOFOCUS_LOSS");

                Log.i(TAG, "onAudioFocusChange: == AUDIOFOCUS_LOSS_TRANSIENT 暂停播放 停止播放");

        @Override

protected void onRestart() {

B:丰厚的API

startBluetoothSco(): 启动蓝牙SCO音频连接

isMicrophoneMute():判断麦克风是否 静音或是否 打开(意味麦克风静音则为true,很久 为false)

情况一:AudioManager.AUDIOFOCUS_GAIN

AudioManager . adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);

带着黑人小哥头上八个问号表情的我说到,按下HOME键如此 声音的嘛,我先试试。产品瞬间反转谄媚一笑说到,下午可不不还也能拿出嘛?我说,这个 声音意味是H5游戏引擎技术的什么的问题,我先看下那先 什么的问题。很久 ,如此 来越多如此 来越多老套路编译代码打开应用插上耳机,进入游戏BGM时间,按下HOME键,MMP,声音真没消失!!!

接着,在 目标Activity 注册广播,(别忘了清单文件注册):

很久 朋友可不不还也能有如下代码去监听情况:

FLAG_VIBRATE(是否 进入振动振铃模式时是否 振动)

                AudioManager.STREAM_MUSIC,

        }

    final String SYSTEM_DIALOG_REASON_RECENT_APPS ="recentapps";

    //启动广播

朋友知道,一款手机意味会有多个应用去播放音频,(手机安装多款音视频播放器这个 是很常见的什么的问题、一起打开多个音视频播放器也是很正常的)

FLAG_ALLOW_RINGER_MODES(更改音量时是否 包括振铃模式作为意味的选项),

接着找到了研究游戏的H5技术,我问朋友这是那先 情况,我说不清楚。。。很久 我说可不可不不还也能我不想调取朋友的JS脚本,我说另另另一2个多会 有有些什么的问题。。。你还是另一方想想办法吧。

setMicrophoneMute(boolean on):设置麦克风静音开启或关闭。( 设置true 关闭麦克风也如此 来越多如此 来越多麦克风静音; 设置false,即关闭静音打开麦克风)

    //动态注册广播

思考:AudioManager的强大之处在于可不不还也能捕获音频流类型、蓝牙相关、麦克风相关等等等,咋样回事 使用主观能动性全在开发者头上;另外通过音频焦点、生命周期以及主动设置音量,可不不还也能帮助朋友有效主动管理音频。

String action = intent.getAction();

            //彻底丢失焦点

                // Use the music stream.

}

//                    Toast.makeText(context, "多任务键被监听", Toast.LENGTH_SHORT).show();

String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);

//      意味请求结果AudioManager.AUDIOFOCUS_REQUEST_GRANTED 则表明 请求成功

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

private AudioManager mAudioManager;

STREAM_VOICE_CALL(电话的音频流),

            //暂停播放  停止播放

情况四:AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK

意味着实这篇文章对你有小小的帮助,希望看官顺势点下一颗宝贵的star,谢谢。

情况二:即应用彻底遗弃了焦点,不还也能播放音频

STREAM_ALARM(警报的音频流)

STREAM_RING(电话铃声的音频流),

比如蓝牙相关的API:

如此 来越多如此 来越多,获取音频焦点的写法如下:

    InnerRecevier innerReceiver =new InnerRecevier();

注意:一旦开始 了了播放,不还也能确保调用abandonAudioFocus()办法。也如此 来越多如此 来越多告知系统朋友不再不还也能获取焦点且取回AudioManager.OnAudioFocusChangeListener监听器。

streamType :要调整的音频流类型。类型有以下几种:

参数预览:

情况四:应用暂时遗弃焦点,很久 这个 DUCK(DUCK翻译:鸭子、闪避、躲避)情况比较特殊,这个 情况意味其它应用可不不还也能继续播放,仅仅是在这个 刻降低另一方应用的音量,直到重新获取到音频焦点后恢复正常音量。应用场景有,比如在播放音乐的很久老会 再次老会 出现一另另一2个多短暂的短信提示声音,仅仅是把歌曲的音量暂时调低,使得用户也能听到短信提示声,在此很久便立马恢复正常播放;再比如语言导航等等

        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {

代码如下:

@Override

情况三:即应用暂时遗弃焦点(比如朋友按下HOME键、电源键等)

isBluetoothA2dpOn() :这个 办法是检查是否 打开或关闭了到蓝牙耳机的A2DP音频路由。

意味音频管理涉及到多媒体,很久 这个 AudioManager获取实例的姿势是另另另一2个多的:

public class InnerRecevier extends BroadcastReceiver {

FLAG_REMOVE_SOUND_AND_VIBRATE(删除意味在队列中或正在播放的任何声音/振动(与更改音量有关)),

isBluetoothScoOn(): 这个 办法主如此 来越多如此 来越多检查通信是否 使用蓝牙SCO。

        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {

                }else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {

AudioManager(audio翻译过来如此 来越多如此 来越多声音、音频):

哦~这个 产品貌似忘了电源键也是可不不还也能关闭界面的吧 ~ ~ ~

void initHomeBroadCast() {

情况一:即应用获取了焦点,获取了焦点即正常播放音频

    };

A:AUDIOFOCUS_GAIN_TRANSIENT  焦点请求是临时

            }else if (focusChange == AUDIOFOCUS_LOSS){

情况三:AudioManager.AUDIOFOCUS_LOSS_TRANSIENT

好了,遇到什么的问题后我跟朋友的常规套路一样,打开浏览器,输入什么的问题,接着search 结青春恋爱物语是明星尴尬了我&我的小伙伴,这都不 些啥。

综上,笔者的这个 什么的问题就可不不还也能通过AudioManager去进行操作:

B: AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK  意味它的音频输出被暂停,如此 很久成功获取焦点的就可不不还也能继续播放

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请换成转载出处,换成原文url地址),文章请勿滥用、开源项目仅供学习交流、也希望朋友尊重笔者的劳动成果,谢谢。

        }

    registerReceiver(innerReceiver, intentFilter);

   //创建广播

}

if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {

比如我现在不想增加音量,就可不不还也能另另另一2个多写:

                Log.i(TAG, "onAudioFocusChange: == AUDIOFOCUS_GAIN 获取焦点  继续播放");

AudioManager . adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);

测试:成功处里了WebView加载H5按下HOME键的声音什么的问题。

        int result = mAudioManager.requestAudioFocus(afChangeListener,

麦克风相关:

区分流类型的目的是让用户也能单独地控制不同的种类的音频。但上述音频种类中,大多数都不 被系统限制。除非应用不还也能做替换闹钟的铃声的操作,不然语录你不还也能通过STREAM_MUSIC来播放你的音频。也如此 来越多如此 来越多说朋友最常见操作的如此 来越多如此 来越多STREAM_MUSIC这个 类型。

音频管理类提供了几滴 的API,那先 API是朋友老会 看得人意味用到的,比如,调节音量,我相信对于如此 来越多如此 来越多人来说,调节音量这个 姿势是很常见的,比如你打开某视频APP、某音乐APP其中肯定有调节音量大小的手势,如此 调节音量內部的逻辑可不不还也能使用 adjustStreamVolume(int streamType, int direction, int flags)

//按下HOEM键后,设置音频流类型为STREAM_MUSIC,Volume为0(也如此 来越多如此 来越多如此 声音)

咋样回事 还再次老会 出现了 上边home键按下有咯噔的声音咋样回事 回事?意味是什么的问题如此 描述清楚,更加详细有些的。嗯,看上去貌似挺靠谱

首先,写一另另一2个多监听HOME键的代码(我这里使用的是广播),在广播上边进行操作,意味按下HOME键很久,广播通知AudioManage关闭声音,很久 打开页面回到目标Activity,在对应的生命周期上边进行音量的设置

            //获取焦点  继续播放

FLAG_SHOW_UI(显示饱含当前音量的吐司),

    //焦点处在改变的监听

万般无奈,最后老会 想到了,不管你是那先 BGM,你都不 声音,既然是声音如此 Android肯定提供了有些API供朋友调用,果不其然,在Android多媒体找到了AudioManager这个 类。

两种生活是:AUDIOFOCUS_REQUEST_FAILED = 0

看来网上的有些办法不行(意味搜索姿势不对),我就带着什么的问题(描述的很清楚写了生命周期如此 作用)去各大Android技术群上边询问有经验的开发人员,结果那先 朋友还是说要在生命周期上边做手脚( - - !),无奈,只得另寻他法。

//                    Toast.makeText(context, "点击了Home键", Toast.LENGTH_SHORT).show();

本篇文章主要介绍的是Android应用(WebView加载H5的音频管理如此 来越多如此 来越多其中的两种生活)咋样有效管理或定制音频的基本内容和有些思路。

首先,咋样获取音频焦点?获取音频焦点通过( AudioManager类 )这个 办法:

谷歌技术团队使用音频焦点(Audio Focus)来控制音频的播放。也如此 来越多如此 来越多,当且仅当apk获取到音频焦点成功很久,才可不不还也能播放音频!

  public int  requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)

}

参数二:streamType(流类型)这个 上边也说了,一般设置为STREAM_MUSIC

mAudioManager.setStreamVolume(STREAM_MUSIC,0,0);

setSpeakerphoneOn(boolean on):这个 办法主如此 来越多如此 来越多判断是否 打开扩音器(设置true,即打开免提电话; false将其关闭)

    final String SYSTEM_DIALOG_REASON_HOME_KEY ="homekey";

两种生活是:AUDIOFOCUS_REQUEST_GRANTED = 1,其中,AUDIOFOCUS_REQUEST_GRANTED代表的如此 来越多如此 来越多获取音频焦点成功

另外源码可不不还也能得知,这个 获取音频焦点的返回值不还也能两种生活:

setStreamVolume(int streamType, int index, int flags)这个 API顾名思义如此 来越多如此 来越多根据音频流类型去设置音量大小的。主要这里的index不还也能超过最大索引,也如此 来越多如此 来越多7。

                // Request permanent focus.

isMusicActive():判断是否 有音乐处在活跃情况(意味任何音乐曲目有效,则为true)

比如,我不想要获取手机的音量,可不不还也能调取getStreamVolume(int streamType); 这里的streamType指获得手机的当前流类型的音量,最大值为7(笔者亲测 Android5.1系统 中兴)最小值为0。

        public void onAudioFocusChange(int focusChange) {

    mAudioManager.setStreamVolume(STREAM_MUSIC, 6, 0);

逐个点进去看看,最后统计汇总下那先 博客上边提供的办法,有使用反射(这个 感觉不咋样就如此 试验)、有说那先 要自定义webview,原生webview控制不住的......(我这另另另一2个多如此 来越多如此 来越多用的第三方轮子)、有说针对生命周期下手的(这个 特殊情况如此 来越多如此 来越多上边写的webview.onResume()等等,很久也说了生命周期没用)、有不想这边研究H5音频控件的......(喂喂喂、医学会 花时间的好嘛?)、有说使用android与H5交互(也如此 来越多如此 来越多Android调H5界面关闭声音的办法,这个 是我很久想到的两种生活办法)这个 办法貌似可行,很久 在上边的有些博客说到这个 方案有些什么的问题。。。更有甚者说,在Activity生命周期上边使用 myWebView.reload();这个 函数,我也是醉了,拜托这是重新加载好嘛。

比如,是否 获取了焦点、焦点是否 遗弃、焦点暂时遗弃等情况 ,通过源码可不不还也能得知,它有两种生活情况,分别是:

direction :调整音量的方向。其中: ADJUST_LOWER(减少铃声音量),ADJUST_RAISE(增加铃声音量)或 ADJUST_SAME(保持很久的铃声音量)

    //设置音量  音频流类型为STREAM_MUSIC,Volume为6 第八个索引不还也能超过最大索引

C: AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 临时的(语音备忘记录或语音识别)

参数一:OnAudioFocusChangeListener(音频焦点处在改变很久的监听),这个 OnAudioFocusChangeListener是AudioManager的一另另一2个多內部接口,本质是监听 音频焦点的情况。

}

void stopBluetoothSco(): 停止蓝牙SCO音频连接。

这句代码的意思是指:指定调节类型为 音乐的音频,增大音量,显示音量图形示意。举一反三下面如此 来越多如此 来越多降低音量的代码:

            Log.i(TAG, "onAudioFocusChange: == "+focusChange);

            if (reason !=null) {

search - 1

flags :一另另一2个多或多个标志。意味这里的标志都不 很好理解,是另另另一2个多,AudioManager提供了有些常量,朋友可不不还也能将那先 系统意味准备好的常量设置为这里的flags,比如:

以上两种生活情况分别代表的意思如下:

STREAM_SYSTEM(系统声音的音频流),

A:获取实例

    IntentFilter intentFilter =new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

setBluetoothScoOn(boolean on): 请求使用蓝牙SCO耳机进行通信。(设置true 代表用于通信的蓝牙SCO; 设置false 即不使用蓝牙SCO进行通信)

    @Override

            if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT){

首先是监听HOME键的广播:

                mAudioManager.abandonAudioFocus(afChangeListener);

FLAG_PLAY_SOUND(是否 在改变音量时播放声音),

参数三:durationHint (持续时间) 根据源码得知有以下几种固定写法:

STREAM_MUSIC(用于音乐播放的音频流)