沉沙
2018-05-11
来源 :
阅读 3102
评论 0
摘要:当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时,用户可能由于音乐声音大而不能听到通知。本篇HTML5教程提供了一种android播放器混音解决方案,希望本篇HTML5教程祝您H5开发更进一步。
当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时,用户可能由于音乐声音大而不能听的通知.从Android2.2开始,平台为应用提供了一个协商它们如何使用设备音频输出的途径,这个机制叫做音频焦点,AudioManager。
当你的应用需要输出像乐音和通知之类的音频时,你应该总是请求音频焦点.一旦应用具有了焦点,它就可以自由的使用音频输出.但它总是应该监听焦点的变化.如果被通知丢失焦点,它应该立即杀死声音或降低到静音水平(有一个标志表明应选择哪一个)并且仅当重新获得焦点后才恢复大声播放。
通过log定位,得出结论:Webview调用的H5播放器的焦点,Android native是会把他当做第三方应用一样处理,简单可以理解为本应用的远程进程。这是根本。
暂时不考虑,蓝牙,录音,其他语音的问题,先处理混音的问题。
因为音频处理是一个比较复杂的问题,了解的人反而深受苦恼,特别是webview进行加载之后,这个问题还是比较棘手。
当第三方应用播放音频抢占焦点了,就开始万恶的混音了。根据上述结果,发现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);
}
}
}
Android WebView 中音频关闭问题的解决方法,简单粗暴。
在焦点变化的时候直接调用下面方法。
webView.reload ();
当H5播放器播放的时候,通过jsbridge先让原生获取焦点 --> Android成功之后,传给H5-->H5调用播放。
以上就是本文全部内容,更多的H5开发知识请关注职坐标HTML5/CSS3频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号