android Html5播放器混音解决方案

背景

当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时,用户可能由于音乐声音大而不能听的通知.从Android2.2开始,平台为应用提供了一个协商它们如何使用设备音频输出的途径,这个机制叫做音频焦点,AudioManager。
当你的应用需要输出像乐音和通知之类的音频时,你应该总是请求音频焦点.一旦应用具有了焦点,它就可以自由的使用音频输出.但它总是应该监听焦点的变化.如果被通知丢失焦点,它应该立即杀死声音或降低到静音水平(有一个标志表明应选择哪一个)并且仅当重新获得焦点后才恢复大声播放。

调研

通过log定位,得出结论:Webview调用的H5播放器的焦点,Android native是会把他当做第三方应用一样处理,简单可以理解为本应用的远程进程。这是根本。

这很重要,这很重要,这很重要!

思考

暂时不考虑,蓝牙,录音,其他语音的问题,先处理混音的问题。
因为音频处理是一个比较复杂的问题,了解的人反而深受苦恼,特别是webview进行加载之后,我当时和leader讨论方案的时候也是从源码着手,发现这个问题还是比较棘手。最后以目的为导向,重新整理了混音问题。


1. 适当场景暂停自己

2. 适当场景暂停别人


忘记那些令人恶心又复杂且睿智的焦点吧,我们只是解决混音正好遇到焦点。

适当场景暂停自己

对于第一个要解决的问题,既然我们是要暂停自己,我们要找到适当的场景,什么时候暂停自己呢?

关键问题让人头大

简单暴力一点,当第三方应用播放音频抢占焦点了,就开始万恶的混音了。根据上述结果,发现H5的焦点Android native是会把他当做第三应用一样处理,简单可以理解本应用的远程进程。
那么暴力的解决方案,当我们永久失去焦点我们就暂停自己。技术实现如下

I. 判断失去焦点

首先,注册一个焦点监听器OnAudioFocusChangeListener 。这个监听器只是处理常用的四种焦点方法,

参数focusChange告诉你音频焦点如何发生了变化,它可以是以上几种值(它们都是定义在AudioManager中的常量):
AUDIOFOCUS_GAIN:你已获得了音频焦点.

AUDIOFOCUS_LOSS:你已经丢失了音频焦点比较长的时间了.你必须停止所有的音频播放.因为预料到你可能很长时间也不能再获音频焦点,所以这里是清理你的资源的好地方.比如,你必须释放MediaPlayer.

AUDIOFOCUS_LOSS_TRANSIENT:你临时性的丢掉了音频焦点,很快就会重新获得.你必须停止所有的音频播放,但是可以保留你的资源,因为你可能很快就能重新获得焦点.

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你临时性的丢掉了音频焦点,但是你被允许继续以低音量播放,而不是完全停止.

  private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = null;   
  //Build.VERSION.SDK_INT表示当前SDK的版本,    Build.VERSION_CODES.ECLAIR_MR1为SDK 7版本 ,    
 //因为AudioManager.OnAudioFocusChangeListener在SDK8版本开始才有。    
if(Build.VERSION.SDK_INT >     Build.VERSION_CODES.ECLAIR_MR1){     
  mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {   
    @Override
        public void onAudioFocusChange(int focusChange) {       
          if(focusChange == AudioManager.AUDIOFOCUS_LOSS){
                //失去焦点之后的操作
            }else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){  
            //获得焦点之后的操作
            }   
            }   
};      

}

II.请求音频焦点,你必须从AudioManager mAudioMgr 调用requestAudioFocus(),如下所示:

private void requestAudioFocus() {  
 if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){
    return;
}
if (mAudioMgr == null)
    mAudioMgr = (AudioManager) ApplicationEx.app.getSystemService(Context.AUDIO_SERVICE);
if (mAudioMgr != null) {
    DLog.i(TAG, "Request audio focus");
    int ret = mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    if (ret != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {               DLog.i(TAG, "request audio focus fail. " + ret);
    }
}

}


暂停H5播放器

Android WebView 中音频关闭问题的解决方法,简单粗暴。

在焦点变化的时候直接调用下面方法。

  webView.reload ();  

适当场景暂停别人

当H5播放器播放的时候,通过jsbridge先让原生获取焦点 --> Android成功之后,传给H5-->H5调用播放。

功夫是杀人技

API:https://developer.android.com/reference/android/media/AudioManager.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,124评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,453评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,386评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,136评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,142评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,593评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,958评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,944评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,477评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,512评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,639评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,227评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,971评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,397评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,550评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,203评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,713评论 2 366

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,456评论 25 707
  • 目录介绍 0.关于项目介绍 0.1 本案例关联博客[共14篇,系统性介绍,全面展开] 0.2 本案例其他说明 0....
    杨充211阅读 3,597评论 9 26
  • Android 8.0 为用户和开发者引入多种新功能。本文重点介绍面向开发者的新功能。 请务必查阅Android ...
    android之子阅读 3,444评论 0 74
  • 冬天是四季当中最冷的一个季节 但是,冬季的雪景还是让大家 有些兴奋又有些激动! 我最喜欢看天空中飘落的雪花 好似在...
    李_昀倩阅读 296评论 0 1
  • 昨天晚上舍友让我看了一下我大一刚来的时候的照片。看完整个人都惊呆了,妈的,那个丑比绝对不是我,太辣眼睛了。看到照片...
    言勿许阅读 265评论 0 0