我有一个 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(扩展 Fragment),它在 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 方法正在触发和调度“模糊”事件,但地理位置仍然处于活动状态(显示在通知区域中)。
tl;博士:
有什么办法可以强制 WebView 放弃地理位置?
编辑:
似乎在使用后退按钮(系统)退出 web 视图时地理定位被停用,但不是在使用导航抽屉导航时简单地导航,就像我要打开抽屉并完全进入应用程序的不同部分。如果我只是按下主页按钮(系统“主页”返回启动器),也会发生这种情况。
这是我使用导航抽屉导航到应用程序的不同部分时的日志输出(在此之后,地理位置仍然处于活动状态):
编辑2:
关于打开/关闭 GPS 的问题有很多。特别是,似乎相关的一个问题是“以编程方式关闭 GPS ” 。选择的问题和答案似乎都符合我的要求,但似乎有点矫枉过正。我没有LocationListener
,为了得到一个,我需要遵循位置策略指南。
似乎通过设置禁用地理定位WebView
应该可以解决问题(就像我在 中所做的那样onPause
),但事实并非如此。
我在 SO 上看到的另一个选项是完全禁用应用程序的 GPS,除非通过利用已修复的安全漏洞,否则这是不可能的。
WebView
这是代码中的错误吗?
编辑3:
我找到了解决我当前问题的方法,这是我的 JavaScript 中的一个错误。地理定位标记的setMap
函数没有清除为地图设置的回调函数。
至于手头更大的问题,为什么网页地理定位会否决WebView
地理定位设置?事实证明,这是一个已被标记为“已修复”的错误(至少对于Activity
. 我怀疑这是一个回归,当WebView
在Fragment
.