我有一个WebView,它提取了一个使用Google Maps API的网页,我有一个名为MapsBase的对象来处理地图内容。在MapsBase init()中我有:
window.addEventListener('blur', (function (obj) {
return function (evt) { obj.Pause(); };
})(this), true);
window.addEventListener('focus', (function (obj) {
return function (evt) { obj.Resume();};
})(this), true);
对这些功能起作用:
MapsBase.prototype.Pause = function () {
//Chrome bug - focus and blur events are called twice.
if (this.isPaused) {
return;
}
if (window['DEBUG']){window.console.log('MapsBase.prototype.Pause()');}
this.isPaused = true;
this.geolocationMarker.setMap(null);
};
MapsBase.prototype.Resume = function () {
if (this.isPaused) { //Chrome bug - focus and blur events are called twice.
if (window['DEBUG']){window.console.log('MapsBase.prototype.Resume()');}
this.isPaused = false;
this.geolocationMarker.setMap(this.map);
}
};
在Android方面,我有我的WebView(扩展片段),它在onStart()中使用它:
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setGeolocationEnabled(true);
settings.setGeolocationDatabasePath(context.getFilesDir().getPath());
并将其作为onPause方法:
@Override
public void onPause(){
if (MainActivity.DEV_MODE) { Log.i("WebFragment","onPause - dispatching the 'blur' event"); }
webView.getSettings().setGeolocationEnabled(false);
super.onPause();
}
似乎所有事件都按计划开火。当我监视Nexus 4上的调试输出时,我看到onPause方法正在触发并调度'blur'事件,但地理位置仍处于活动状态(显示在通知区域中)。
有没有办法强制WebView放弃地理位置?
当使用后退按钮(系统)退出webview时,似乎停用了地理定位,但是当我使用Navigation Drawer导航进行简单导航时,似乎没有,就像我要打开抽屉并转到应用程序的完全不同的部分。如果我只按下主页按钮(系统“主页”返回发射器),也会发生这种情况。
这是使用导航抽屉导航到应用程序的其他部分时的日志输出(在此之后,地理定位仍处于活动状态):
关于开启/关闭GPS的问题,有很多问题。
特别是,似乎相关的问题是Switch off GPS programatically。选择的问题和答案似乎都符合我的要求,但看起来似乎有点矫枉过正。我没有LocationListener
,为了得到一个,我需要关注Location Strategies指南。
似乎通过WebView
设置要禁用的地理位置应该可以解决问题(就像我在onPause
中所做的那样),但事实并非如此。
我在SO上看到的另一个选项就是完全禁用应用程序的GPS,isn't possible除非通过利用已经修复的安全漏洞。
这是WebView
代码中的错误吗?
我找到了解决我当前问题的方法,这是我的JavaScript中的一个错误。地理位置标记的setMap
函数未清除为地图设置的回调函数。
至于手头较大的问题,为什么网页地理位置会否决WebView
地理定位设置?事实证明此this was a bug已被标记为“修复“(至少对Activity
)。我怀疑这是一个回归,显示WebView
在Fragment
内运行时。
答案 0 :(得分:0)
我知道这为时已晚,但是可以用作将来参考:
@Override
public void onPause(){
this.webView.onPause();
this.webView.pauseTimers();
super.onPause();
}
在webview文档中:
onPause()公共无效
尽力尝试暂停任何可以安全暂停的处理,例如动画和地理位置。请注意,此调用不会暂停JavaScript。要全局暂停JavaScript,请使用pauseTimers()。要恢复WebView,请调用onResume()。