javascript - onPause() 之后,地理位置在 WebView 上保持 Activity 状态

标签 javascript android google-maps-api-3 webview geolocation

我有一个 WebView,它可以打开一个使用 Google Maps API 的网页,并且我有一个名为 MapsBase 的对象,它可以处理 map 内容。在 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 方法正在触发并分派(dispatch)“模糊”事件,但地理位置仍然处于 Activity 状态(显示在通知区域中)。

tl;博士:

有没有办法强制WebView放弃地理定位?

编辑:

当使用后退按钮(系统)退出 WebView 时,地理位置似乎被停用,但当简单地使用 Navigation Drawer 导航时则不会。我正在进行导航,就像我要打开抽屉并转到应用程序的完全不同的部分一样。如果我只按主页按钮(系统“主页”返回启动器)也会发生这种情况。

这是我使用抽屉导航导航到应用程序的不同部分时的日志输出(在此之后,地理位置仍然处于 Activity 状态): enter image description here

编辑2:

SO 上有很多关于打开/关闭 GPS 的问题。 特别是,似乎相关的问题是Switch off GPS programatically。 。选择的问题和答案似乎都符合我正在寻找的内容,但似乎有点矫枉过正。我没有 LocationListener,为了获得一个,我需要遵循 Location Strategies指南。

似乎通过 WebView 设置禁用地理定位应该可以解决问题(就像我在 onPause 中所做的那样),但事实并非如此。

我在 SO 上看到的另一个选项是完全禁用该应用程序的 GPS,这 isn't possible除非通过利用已修复的安全漏洞。

这是 WebView 代码中的错误吗?

编辑3:

我找到了解决当前问题的方法,这是我的 JavaScript 中的一个错误。地理位置标记的 setMap 函数未清除为 map 设置的回调函数。

至于眼前更大的问题,为什么网页地理位置会覆盖WebView地理位置设置?事实证明,这个this was a bug已被标记为“已修复”(至少对于 Activity 而言)。我怀疑这是当 WebViewFragment 中运行时出现的回归。

最佳答案

我知道这已经太晚了,但为了将来的引用,可以使用:

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

webview文档:

public void onPause ()

Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. Note that this call does not pause JavaScript. To pause JavaScript globally, use pauseTimers(). To resume WebView, call onResume().

关于javascript - onPause() 之后,地理位置在 WebView 上保持 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120387/

相关文章:

Javascript - 查找字符串中单词的特定出现位置(不是第一个或最后一个)

javascript - 意外的 token : Express and nodejs

android - com.googlecode.mp4parser无法获取mp3音频文件?

安卓 Gradle Jacoco : offline instrumentation for integration tests

javascript - 使用 Google Maps API 配置热图覆盖

javascript - Firebase 使用 JavaScript 提取数组中的特定项目

javascript - 如何在 JavaScript 中使用函数构建对象

android - 在 Android 中从外部存储打开文件

javascript - Google phpsqlajax v3 无法正常工作...仅标记未显示在 map 上

json - 使用谷歌地点 api 检索地点/国家/地区的兴趣点(景点/旅游景点)