无法使用 HTML5 Geolocation 和 Android 获取不同用户的位置

Posted

技术标签:

【中文标题】无法使用 HTML5 Geolocation 和 Android 获取不同用户的位置【英文标题】:Unable to get location with HTML5 Geolocation and Android with different user 【发布时间】:2015-04-30 12:13:21 【问题描述】:

我正在开发一款适用于 android 的应用程序,该应用程序将在单一类型的设备上运行,即三星 Galaxy Tab 3 8.0 - 在 Android KitKat 4.4.2 上运行。

我们的设备上有多个用户,所有者和一个受限个人资料帐户,供我们公司的员工使用。

我的应用程序有一个WebView,它在其中从 Web 服务器加载我们的 Web 应用程序,该服务器对其布局做出响应,并且在登录请求时,我们要求访问者使用 html5 地理位置共享他/她的位置。

分享一个人的位置就像在网络上的魅力一样(使用计算机上的浏览器或移动设备上的浏览器),在所有者帐户启动时在应用程序上正常工作,等等。

但是,如果我以受限个人资料帐户运行此应用程序,我只会达到我在 javascript 中设置的超时时间,然后会出现消息,而不会发生其他任何事情。

这是我用于调用共享位置的 JavaScript:

if (navigator.geolocation) 
    navigator.geolocation.getCurrentPosition(getPositionForMobileApp, getLocationErrorHandler, frequency: 5000, maximumAge: 0, timeout: 60000, enableHighAccuracy: true);
 else 
    $('.panel-body').first().html('<small>Your browser doesn\'t support <strong>HTML5 Geolocation</strong>.<br /> Please install a newer version of your Internet Browser.</small>');

HTML5 Geolocation API 的 JavaScript 回调是:

function getPositionForMobileApp(position) 
    $('input#position').val(position.coords.latitude + ';' + position.coords.longitude);

    $.post('/user/login?usingMobileApp=true', position: (position.coords.latitude + ';' + position.coords.longitude), function (data) 
        if (data.success) 
            $('.panel-body').first().html(data.html);

            // this is for testing/debugging purposes
            $('.col-md-12.text-center small').html(position.coords.latitude + ' ----------- ' + position.coords.longitude);

            $('input#login').focus();
         else 
            $('.panel-body').first().html('<small><strong>Request is not valid!</strong><br /><br />We've blocked your IP Address: <kbd>' + data.ip + '</kbd> for next 24 hours.</small>');
        
    , 'json');


如前所述,这在计算机上的其他浏览器和移动设备上的浏览器上运行良好,除非我使用受限配置文件帐户从移动设备上的 Chrome 浏览器运行我的 URL - 它甚至不会提示我打开Chrome 是共享位置还是阻止它。

当我使用内置互联网浏览器应用程序以这种方式运行它时,它会提示我,如果我接受,我会定期获得我的职位。

所以我相信这与三星/Android 建立的用户限制有关,我不知道是谁了。

这些是我在AndroidManifest.xml 中的权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />

我将所有这些用于不同的目的;我不知道是否有些可能会与其他人发生碰撞或其他什么,但我需要所有这些。

这是我的onGeolocationPermissionsShowPrompt 方法覆盖:

mWebView.setWebChromeClient(new WebChromeClient() 
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin, final GeolocationPermissions.Callback callback) 
        // I doubt that this is needed at all, but I've added it anyway
        GeolocationPermissions.getInstance().allow(origin);

        // as said, works well on other places...
        callback.invoke(origin, true, false);

        // after so much frustration, I've added the parent method.
        super.onGeolocationPermissionsShowPrompt(origin, callback);
    
);

我什么都不知道了;想不通。

【问题讨论】:

【参考方案1】:

我最终解决了这个问题,但之前没有时间回答。

因此,问题在于 Android 中的受限配置文件,它限制使用 HTML5 地理定位 API、浏览器通知和现代浏览器中存在的许多其他新功能。

解决方案是避免对这类在应用内实现 HTML5 Geolocation API 的应用使用受限配置文件,主要是使用 WebView。

我们为用户提供了对系统/设备的完全访问权限,并且它运行良好。

我希望这对将来的任何人都有帮助。


顺便说一句,我不确定这个问题是否在较新的 Android 版本(如 5.x6)中得到解决,但我当然希望是这样。

【讨论】:

以上是关于无法使用 HTML5 Geolocation 和 Android 获取不同用户的位置的主要内容,如果未能解决你的问题,请参考以下文章

Geolocation html5 在网络浏览器上工作,但在 iPhone 浏览器上不工作

html5-geolocation : navigator.geolocation.watchPosition 连续回调

如何让 HTML5 Geolocation 更准确?

HTML5 地理位置 - 在 iOS 上无法一直工作

如何在 python 中制作 HTML5 Geolocation 对象?

HTML5 Geolocation(地理定位)简介