2010-07-30 68 views
9

我正在開發一個網站,它依賴於拉取移動用戶的地理位置數據。我通過做它的典型方式:Android上的javascript地理位置無法正常工作

function initialize() { 
    if(window.google && google.gears) { 
     var geo = google.gears.factory.create('beta.geolocation'); 
     geo.getCurrentPosition(useLocation, errorOnLocate); 
    } 
    else if(navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(useLocation, errorOnLocate); 
    } 
    else { 
     alert("no geo found"); 
    } 
} 

function errorOnLocate(message) 
{ 
    alert(message); 
    zoomTo(-34.397, 150.644); 
} 

這總是失敗,[對象PositionError]到errorOnLocate功能,即使我轉的地理定位方法的順序。

這是HTC的英雄與Android 2.1使用任何瀏覽器內置。我的GPS是開着的,我已經指示瀏覽器允許網站查看我的位置。谷歌地圖原生應用程序上的「位置」功能在手機上提取我的位置很好

此外,如果我在我的個人計算機上使用FireFox 3.5訪問我的網站,它會發現我的位置正確。它使用ip和ap數據點的組合)。無論哪種方式,它使用相同的JavaScript。

編輯:這是瀏覽器中的html/js,而不是本機應用程序。另外確切的錯誤信息是'最後的位置提供商被禁用'

回答

12

這是從WebView或從Android瀏覽器應用程序訪問?如果來自WebView,則可能需要通過Java調用啓用地理定位。請參閱WebView reference

否則,我不知道恰恰是錯的JS,但這裏的HTML + JS,我知道了Android瀏覽器的工作原理:

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript"> 
function watchLocation(successCallback, errorCallback) { 
    successCallback = successCallback || function(){}; 
    errorCallback = errorCallback || function(){}; 

    // Try HTML5-spec geolocation. 
    var geolocation = navigator.geolocation; 

    if (geolocation) { 
    // We have a real geolocation service. 
    try { 
     function handleSuccess(position) { 
     successCallback(position.coords); 
     } 

     geolocation.watchPosition(handleSuccess, errorCallback, { 
     enableHighAccuracy: true, 
     maximumAge: 5000 // 5 sec. 
     }); 
    } catch (err) { 
     errorCallback(); 
    } 
    } else { 
    errorCallback(); 
    } 
} 

function init() { 
    watchLocation(function(coords) { 
    document.getElementById('test').innerHTML = 'coords: ' + coords.latitude + ',' + coords.longitude; 
    }, function() { 
    document.getElementById('test').innerHTML = 'error'; 
    }); 
} 
    </script> 
</head> 

<body onload="init()"> 
    <div id="test">Loading...</div> 
</body> 
</html> 
+1

嗯,謝謝你的回覆。這是一種不同的方法,但行爲是奇怪的。它需要2分鐘才能找到一個位置,一旦它顯示了座標約5秒鐘,然後最後只顯示「錯誤」。 – 2010-07-30 01:38:42

+1

我在上面的代碼中添加了選項,它的工作原理相同,需要2分鐘才能獲得位置,但至少不會出錯。關鍵是enableHighAccuracy標誌,每次都沒有錯誤標誌。你知道有一個更專業的論壇來進行這項調查,因爲在2分鐘內獲得鎖定這個項目已經死亡。 – 2010-07-30 02:01:36

+2

奇怪,我幾乎立即在我的Nexus One上收到回覆。也許這是設備的問題,而不是代碼?我會用模擬器嘗試這一點,並通過DDMS發送模擬位置數據。 – 2010-07-30 02:17:17

0

我已經測試HTML5的地理定位功能與以下兩個手機:

  • HTC野火
  • HTC銀河

兩者都運行Android 2.1 UPDATE1 OS和兩個失敗使用內置的谷歌瀏覽器和演示網站喜歡做的地理位置:

不過,我已經開發了自己的應用程序(使用上面已經介紹的代碼的組合):

  • HTC Wildfire
  • Android 2。1個UPDATE1模擬器
  • 還沒有HTC銀河還沒有測試

,我使用的代碼是:

  1. 的Javascript lib目錄下:在我的HTML

     
    function is_browser_gps_capable() { 
        var _locator_object; 
        try { 
         _locator_object = navigator.geolocation; 
        } catch (e) { return false; } 
        if (_locator_object) 
         return true; 
        else 
         return false; 
    }

    function watchLocation(successCallback, errorCallback) { successCallback = successCallback || function(){}; errorCallback = errorCallback || function(){};

    // Try HTML5-spec geolocation. 
    var geolocation = navigator.geolocation; 
    
    if (geolocation) { 
        // We have a real geolocation service. 
        try { 
         function handleSuccess(position) { 
         successCallback(position.coords); 
         } 
    
         geolocation.watchPosition(handleSuccess, errorCallback, { 
         enableHighAccuracy: true, 
         maximumAge: 5000 // 5 sec. 
         }); 
        } catch (err) { 
         errorCallback(); 
        } 
        } else { 
        errorCallback(); 
        } 
    

    }

  2. 實際代碼文件:

     
    if (is_browser_gps_capable()) { 
        $('geo_location').innerHTML = 'Locating device...'; 
        watchLocation(function(coords) { 
          var latlng = new google.maps.LatLng(coords.latitude, coords.longitude); 
          var myOptions = { 
          zoom: 16, 
          center: latlng, 
          mapTypeId: google.maps.MapTypeId.ROADMAP 
          }; 
          var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
          var marker = new google.maps.Marker({ 
           position: latlng, 
           map: map, 
          });
    $('geo_location').innerHTML = coords.latitude + ',' + coords.longitude; }, function() { $('geo_location').innerHTML = 'Not supported'; }); } else { $('geo_location').innerHTML = 'Not supported'; }

對不起,這個源代碼只是不想格式正確,給我發消息,我會直接給你發送代碼,如果你願意的話。 >位置&隱私 - -

1

這是沒有工作在我的Android 2.4,這個問題是通過啓用無線網絡位置除了GPS(不是隻有GPS工作)

設置解決>啓用無線網絡。

0

我有這個問題,我認爲這是因爲設備上的電源很低。充電並且問題消失了。