模拟 GPS 位置和适用于 Android 的 Chrome

Posted

技术标签:

【中文标题】模拟 GPS 位置和适用于 Android 的 Chrome【英文标题】:Mock GPS location and Chrome for Android 【发布时间】:2017-01-05 23:30:21 【问题描述】:

我有一个带有蓝牙的 Trimble ProXT GNSS 接收器,可以使用 Trimble GNSS Status 应用程序连接到安卓。该应用程序输出基本单元的位置,如果我在开发人员选项中选择该应用程序作为模拟位置提供程序,它在所有本机应用程序中运行良好,但如果我尝试使用使用 html5 地理位置 API 的 Web 应用程序,它会失败。我的 GIS 数据采集应用是基于网络的,我需要它来工作!

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并能够从 Trimble 获得一些帮助:

我假设您正在使用 android,因为我们也看到了这种行为。不幸的是,您注意到的是 Google Chrome 的一个奇怪的行为特征。您会发现,如果您使用 Firefox 浏览器(或其他几个浏览器)并访问同一个 maps.google.com,该位置将正确显示。

令人费解的是,Location API 的 Chrome 实现并非在所有情况下都处理模拟位置。我们正在对此进行调查,但目前还没有正式的解决方案(除了非 Chrome 浏览器的解决方法)。

【讨论】:

【参考方案2】:

在 R2 上使用 Trimble“GNSS 状态”应用程序并在 ipad+chrome 和各种 android+chrome 组合中遇到相同的问题,而 firefox 和 safari 工作正常。

一个简单的测试:

<DOCTYPE html>
<html>
  <head>
    <style>
      body 
          background: white;
          font-family: Arial, Helvetica, sans-serif;
          font-size: 1em;
          color: #000;
      
      @media all and (max-width: 1000px) 
          body  font-size: 200%;
      
    </style>
    <script>
      function init() 
        var compass = document.getElementById('compass');
        var lat = document.getElementById('lat');
        var lon = document.getElementById('lon');
        var acc = document.getElementById('acc');
        var alt = document.getElementById('alt');
        var altAcc = document.getElementById('altAcc');
        var err = document.getElementById('err');
        var heading = document.getElementById('heading');
        var speed = document.getElementById('speed');
        var timestamp = document.getElementById('timestamp');

        if(window.DeviceOrientationEvent) 
            window.addEventListener('deviceorientation', function(event) 
                var alpha;
                if(event.webkitCompassHeading) 
                  alpha = event.webkitCompassHeading;
                
                else 
                  alpha = event.alpha;
                
                compass.innerHTML = alpha;
            , false);
        

        if(navigator.geolocation) 
            var opts = 
                        enableHighAccuracy: true,
                        timeout: 6000,
                        maximumAge: 5000
                       ;
            navigator.geolocation.watchPosition(
                    updateLocation,
                    handleLocationError,
                    opts
            );
        
      

    function updateLocation(position) 
        lat.innerHTML = position.coords.latitude;
        lon.innerHTML = position.coords.longitude;
        acc.innerHTML = position.coords.accuracy;
        alt.innerHTML = position.coords.altitude;
        altAcc.innerHTML = position.coords.altitudeAccuracy;
        heading.innerHTML = position.coords.heading;
        speed.innerHTML = position.coords.speed;
        var t = new Date(position.timestamp).toString();
        timestamp.innerHTML = t;
        addMsg(t);
    

    function handleLocationError(e)
      var msg = e.code+': ';
      switch (e.code) 
          case error.PERMISSION_DENIED:
              msg += 'Permission was denied';
              break;
          case error.POSITION_UNAVAILABLE:
              msg +='Position is currently unavailable.';
              break;
          case error.PERMISSION_DENIED_TIMEOUT:
              msg += 'User took to long to grant/deny permission.';
              break;
          case error.UNKNOWN_ERROR:
              msg += 'An unknown error occurred.';
              break;
      
      addMsg(msg);
    

    function addMsg(msg)
      err.appendChild(document.createTextNode('message: '+ msg));
      err.appendChild(document.createElement("br"));
    
    </script>
  </head>
  <body onload="init()" >
      <p>compass: <span id="compass"></span> deg</p>
      <hr>
      <p>lat: <span id="lat"></span> deg</p>
      <p>lon: <span id="lon"></span> deg</p>
      <p>acc: <span id="acc"></span> m</p>
      <p>alt: <span id="alt"></span> m +msl</p>
      <p>alt. acc: <span id="altAcc"></span> m</p>

      <p>heading: <span id="heading"></span> deg</p>
      <p>speed: <span id="speed"></span> m/s</p>
      <p>timestamp: <span id="timestamp"></span></p>
      <hr>
      <p>messages:</p>
      <div id="err"></div>
  </body>
</html>

【讨论】:

以上是关于模拟 GPS 位置和适用于 Android 的 Chrome的主要内容,如果未能解决你的问题,请参考以下文章

Android 模拟位置不适用于谷歌地图

android:如何使用模拟(假)坐标修复 gps?

通过 DDMS 在 Android 设备上模拟模拟位置

Android模拟器GPS位置给出了错误的时间

正在尝试在 Android 设备上检索位置...适用于模拟器,但不适用于真实设备

Android模拟器设置gps地理位置