在onPause()之后,地理位置在WebView上保持活动状态

时间:2013-10-01 15:36:52

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

我有一个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'事件,但地理位置仍处于活动状态(显示在通知区域中)。

TL; DR:

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

编辑:

当使用后退按钮(系统)退出webview时,似乎停用了地理定位,但是当我使用Navigation Drawer导航进行简单导航时,似乎没有,就像我要打开抽屉并转到应用程序的完全不同的部分。如果我只按下主页按钮(系统“主页”返回发射器),也会发生这种情况。

这是使用导航抽屉导航到应用程序的其他部分时的日志输出(在此之后,地理定位仍处于活动状态): enter image description here

编辑2:

关于开启/关闭GPS的问题,有很多问题。 特别是,似乎相关的问题是Switch off GPS programatically。选择的问题和答案似乎都符合我的要求,但看起来似乎有点矫枉过正。我没有LocationListener,为了得到一个,我需要关注Location Strategies指南。

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

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

这是WebView代码中的错误吗?

编辑3:

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

至于手头较大的问题,为什么网页地理位置会否决WebView地理定位设置?事实证明此this was a bug已被标记为“修复“(至少对Activity)。我怀疑这是一个回归,显示WebViewFragment内运行时。

1 个答案:

答案 0 :(得分:0)

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

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

webview文档中:

  

onPause()公共无效

     

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