1

我有一个 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. 我怀疑这是一个回归,当WebViewFragment.

4

1 回答 1

0

我知道这为时已晚,但为了将来参考,可以使用:

@Override
public void onPause(){
    this.webView.onPause();
    this.webView.pauseTimers();
    super.onPause();
}

webview文档中:

公共无效 onPause ()

是否尽最大努力尝试暂停任何可以安全暂停的处理,例如动画和地理定位。请注意,此调用不会暂停 JavaScript。要全局暂停 JavaScript,请使用 pauseTimers()。要恢复 WebView,请调用 onResume()。

于 2018-09-29T13:47:55.753 回答