Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
@Override
protected void onPause() {
super.onPause();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mWebView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mWebView.onResume();
}
hideKeyBoard();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebView.resumeTimers();
mWebView.destroy();
}
如果网页中的加载的是视频,我们在 onPause() ,onResume(),onDestroy(),是可以很好地暂停播放的,但如果是在网页中加载的是声音或者音乐的话,我们会发现这样不能控制它.通过查阅资料,我们发现这是Android的一个BUG,但因为Android的音乐流,音效流,电话声音是互不干涉的,且通过获取焦点来进行播放,多数情况下我们播放音乐都是使用 STREAM_MUSIC 音频流。
@Override
protected void onPause() {
super.onPause();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mWebView.onPause();
}
//让音乐控件失去焦点来禁止掉声音的播放
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
} else {
try {
audioManager = (AudioManager) getSystemService(InterDetailActivity.this.AUDIO_SERVICE);
int i = ;
do {
int result = audioManager.requestAudioFocus(listener
, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d("AudioManager", "I get Audio right: ");
break;
}
i++;
} while (i < );
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
对控制音乐播放控件的 焦点是否改变进行监听
OnAudioFocusChangeListener listener = new OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
Log.d("audioManager", "onAudioFocusChange: "
+ focusChange);
}
};
这时候,你会发现,我们在正常打开该webview,音乐控件播放,点击分享弹出分享编辑页面,或者锁屏使网页界面不可见状态,音乐声音也跟着没有了,然后我们再返回到带有音乐控件的网页,但是问题来了,音乐控件的转动播放却没有声音,而我们要的是,在这个网页可见的时候要有音乐的,这是因为,之前做的播放控件失去焦点,禁止掉了声音,这时我们只需要在onResue()或onRestar()中,让该H5页面再重新刷新下,音乐就播放出来了
@Override
protected void onRestart() {
super.onRestart();
mWebView.reload();
}
@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
mWebView.onResume();
// mWebView.reload();
}
}
web.pauseTimers();
web.stopLoading();
web.loadData("<a></a>", "text/html", "utf-8");
这个方法,已进入H5网页快速点击分享,在后台没有声音了,但当我们再回到网页界面,该网页空白了,没有了数据,更没有音乐的播放控件了,使用mWebView.reload();也不能刷新出来,我们需要mWebView.loadUrl(....)再重新加载一次这个h5网址.依然是刚才的例子,这是一个可滑动翻页的H5页面,如果分享前我们滑动到第三个页面,点击的分享,WebView.loadUrl()后会又回到第一页.这也不是我们想要的,我们要的是,滑动到那个页面,最后还回到那个页面.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
initView();
}
@Override
protected void onRestart() {
super.onRestart();
mWebView.reload();
}
@Override
protected void onResume() {
super.onResume();
isPause = false;
hideKeyBoard();
}
@Override
protected void onPause() {
super.onPause();
isPause = true;
requestAudioFocus();
}
@Override
protected void onDestroy() {
super.onDestroy();
mWebView.destroy();
mAudioManager.abandonAudioFocus(audioFocusChangeListener);
private void requestAudioFocus() {
int result = mAudioManager.requestAudioFocus(audioFocusChangeListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.e(TAG, "audio focus been granted");
}
}
private OnAudioFocusChangeListener audioFocusChangeListener = new OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
Log.e(TAG, "focusChange: " + focusChange);
if (isPause && focusChange == AudioManager.AUDIOFOCUS_LOSS) {
requestAudioFocus();
}
}
};
好了,这样我们就可以解决问题了,是不是很简单?重要的地方就是在焦点改变的监听时进行该操作
if (isPause && focusChange == AudioManager.AUDIOFOCUS_LOSS) {
requestAudioFocus();
}
这个问题到此就结束了,希望能有帮助!
Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决的更多相关文章
- 在WinForm应用程序中,使用选项卡控件来加载不同的Form界面!
TabPage tp=new TabPage(); your选项卡控件.Controls.Add(tp); From1 frm=new Form1(); frm.TopLevel = false; f ...
- Android在onCreate()方法中动态获取TextView控件的高度
正好朋友项目里遇到了给写了个小Demo: 这个监听器看名字也知道了.就是在绘画完毕之前调用的,在这里面能够获取到行数.当然也能够获取到宽高等信息 package com.example.textvie ...
- 从数据池中捞取的存储过程控件使用完以后必须unprepare
从数据池中捞取的存储过程控件使用完以后必须unprepare,否则会造成输入参数是仍是旧的BUG. 提示:动态创建的存储过程控件无此BUG.此BUG只限于从数据池中捞取的存储过程控件. functio ...
- android中一个评分的控件
RatingBar android中一个评分的控件 如何使用 Android Studio下: dependencies { compile 'com.hedgehog.ratingbar:app:1 ...
- Android中查找一个Layout中指定的子控件
我们通常希望查找一个页面中指定类型的控件,单个控件知道id很容易找到,但是如果是多个呢?或者说是在程序中自定义的控件,且不知道id怎么办呢?如想找到页面中的Spinner,可用以下方法 /** * 从 ...
- 在DevExpress程序中使用Winform分页控件直接录入数据并保存
一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...
- ANDROID L——Material Design详解(UI控件)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
- Android判断Touch为滑动事件还是操作控件
Android判断Touch为滑动事件还是操作控件 因为在项目中要判断WebView是否处于滚动状态,但它不像ListView有onScrollStateChanged方法来监听,要实现就得手动监听它 ...
- jquery和css自定义video播放控件
下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...
随机推荐
- CodeForcesGym 100753A A Journey to Greece
A Journey to Greece Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on CodeFor ...
- hdu 1269 求连通图的模板题
#include<stdio.h> #include<string.h> #include<iostream>//只存在一个连通分量 #include<str ...
- 复习1背包dp
背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...
- VNC Viewer 设置屏幕分辨率-解决屏幕分辨率问题
https://blog.csdn.net/runningtortoises/article/details/51425332
- Ubuntu 16.04监控网络带宽软件
1.系统监控器已经自带了默认的监控功能,包括CPU.内存.带宽.进程等,但带宽的一些详情不能显示出来. 2.使用top命令进行监控进程 sudo top 3.安装Indicator-sysmonito ...
- Eclipse修改默认包路径的起始文件夹
一般新建的Java Project项目都是从src文件夹开始的,那么通过下面的操作可以自定义修改起始文件夹. 1.项目右键->[Properties] 如果不能修改时,可以直接删除后再添加回来.
- Hadoop2.0安装之非HA版
主要步骤跟Hadoop1.0(1.0安装地址)一致,主要在配置这块有更改 安装 下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.6.5 ...
- bzoj1072【SCOI2007】排列perm
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1479 Solved: 928 [id=1072&q ...
- [Vue @Component] Pass Vue Render Functions as Props for Powerful Patterns
Render functions open up a world of customization and control by using pure JavaScript rather than V ...
- 一个JS多个数组取交集算法
如题,多个数组中取交集(共同拥有元素),思路取第一个数组去跟每个数组中的元素对比,同时比较数据类型有救返回没有就返回null. 下面介绍到的算法数据格式是二维数组如: const parentArra ...