해당 객체가 존재하는 경우 지오로케이션 서비스가 가능합니다. 지오로케이션 사용 가능 여부는 다음과 같이 테스트 할 수 있습니다.
if("geolocation"in navigator){/* 지오로케이션 사용 가능 */}else{/* 지오로케이션 사용 불가능 */}
현재 위치 가져오기
사용자의 현재 위치를 얻기 위해서는 getCurrentPosition() 메서드를 호출하면 됩니다. 사용자 위치를 탐지하는 비동기 요청을 초기화하고, 하드웨어에 사용자의 최신 위치 정보를 요청합니다. 위치가 확인되면 정의된 콜백 함수가 실행됩니다. 선택적으로 에러가 발생할 때 실행될 두번째 콜백함수를 지정할 수 있습니다. 세번째 선택적인 파라미터는 옵션 객체인데, 위치값이 반환된 최대 시간과 요청을 대기할 시간, 그리고 높은 정확도를 사용할 지 여부를 지정합니다.
노트: 기본적으로, getCurrentPosition() 은 최대한 빨리 응답이 오겠지만 정확도는 낮습니다. 정확도에 개의치 않고 빠른 응답을 필요로 하는 경우 유용합니다. 예를 들어, GPS가 있는 장치는 고정된 GPS를 얻기 위해서 일분 이상의 시간이 필요해서 getCurrentPosition() 는 덜 정확한 정보(IP 위치 또는 wifi)를 반환합니다..
최대한 정확도를 높게 받을 것인지를 지시하는 불리언 값입니다. true 값을 지정하면 장치에서 정확도가 높은 위치 정보를 제공 할 수 있으면 제공해 줍니다. 이것은 응답 시간이 느려지거나 전력소비(예:모바일 장치의 GPS 칩)가 늘어 나니까 주의해야 합니다. 반대로 false를 지정하면 장치는 적은 전력을 사용하든 빠른 응답을 하든 자원을 적절히 사용할 자유를 갖게 됩니다.
timeout
위치 값을 장치로 부터 받을 때 까지 최대한 대기할 시간을 양의 정수(천분의 일초 단위)로 지정합니다. 기본값은 Infinity이며, getCurrentPosition() 는 위치값이 가능 할때 까지 반환하지 않습니다.
maximumAge
캐시된 위치 값을 반환 받아도 되는 최대한의 시간을 천분의 일초 단위로 양의 정수로 나타냅니다. 0을 지정하면 캐시된 위치를 사용하지 말라는 의미이고, 반드시 실제 현재 위치를 수집하고자 하는 것을 나타냅니다. Infinity를 지정하면 장치는 캐시된 위치 정보 중 언제 수집되었는지 개의치 않고 반환 합니다.
장치가 움직이는 방향을 나타내는 숫자. 이 값은 정북에서 벗어난 각을 나타냅니다. 0도는 정북향을 나타내며 방향은 시계방향(동쪽은 90도이고, 서쪽은 270도라는 의미)입니다. speed 값이 0이면 heading 값은 NaN이 됩니다. 장치에서 heading 정보를 제공 할 수 없을 때 이 값은 null이 됩니다.
speed
장치의 속도를 나타내며, 초당 미터 값을 숫자로 나타냅니다. 이 값은 null 일 수 도 있습니다.
에러 처리
getCurrentPosition() 또는 watchPosition()를 호출할 때 전달한 에러 콜백 함수에는 PositionError 객체가 첫 번째 파라미터로 전달됩니다.
에러 코드를 나타내는 숫자입니다. (1)권한 없음(permission denied), (2) 위치확인 불가(position unavailable), (3) 시간초과(timeout) 중에 하나의 값이 됩니다.
message
사람이 읽을 수 있는 에러 메시지를 문자열로 표혀합니다.
PositionOptions
PositionOptions 객체는 아래의 프러퍼티를 갖는 자바스크립트 객체입니다 :
enableHighAccuracy
최대한 정확도를 높게 받을 것인지를 지시하는 불리언 값입니다. true 값을 지정하면 장치에서 정확도가 높은 위치 정보를 제공 할 수 있으면 제공해 줍니다. 이것은 응답 시간이 느려지거나 전력소비(예:모바일 장치의 GPS 칩)가 늘어 나니까 주의해야 합니다. 반대로 false를 지정하면 장치는 적은 전력을 사용하든 빠른 응답을 하든 자원을 적절히 사용할 자유를 갖게 됩니다.
timeout
위치 값을 장치로 부터 받을 때 까지 최대한 대기할 시간을 양의 정수(천분의 일초 단위)로 지정합니다. 기본값은 Infinity이며, getCurrentPosition() 는 위치값이 가능 할때 까지 반환하지 않습니다.
maximumAge
캐시된 위치 값을 반환 받아도 되는 최대한의 시간을 천분의 일초 단위로 양의 정수로 나타냅니다. 0을 지정하면 캐시된 위치를 사용하지 말라는 의미이고, 반드시 실제 현재 위치를 수집하고자 하는 것을 나타냅니다. Infinity를 지정하면 장치는 캐시된 위치 정보 중 언제 수집되었는지 개의치 않고 반환 합니다.
functiongeoFindMe(){var output = document.getElementById("out");if(!navigator.geolocation){
output.innerHTML ="<p>사용자의 브라우저는 지오로케이션을 지원하지 않습니다.</p>";return;}functionsuccess(position){var latitude = position.coords.latitude;var longitude = position.coords.longitude;
output.innerHTML ='<p>위도 : '+ latitude +'° <br>경도 : '+ longitude +'°</p>';var img =newImage();
img.src ="http://maps.googleapis.com/maps/api/staticmap?center="+ latitude +","+ longitude +"&zoom=13&size=300x300&sensor=false";
output.appendChild(img);};functionerror(){
output.innerHTML ="사용자의 위치를 찾을 수 없습니다.";};
output.innerHTML ="<p>Locating…</p>";
navigator.geolocation.getCurrentPosition(success, error);}
라이브 결과
권한 허락
addons.mozilla.org 에 등록되는 어떤 부가기능(Add-on)도 지오로케이션 데이타를 사용하기 위전에는 명시적인 권한 허락이 필요합니다. 아래의 함수는 웹페이지에 권한을 요청하는 프롬프트를 표시할 것입니다. 가능하다면 사용자의 응답은 pref 파라미터를 통해 프리퍼런스에 저장될 것입니다. 콜백 파라미터에 전달된 함수는 사용자의 응답을 가리키는 불리언 값을 가지고 호출 됩니다. 만약 true 값이 전달 되었다면 부가기능(Add-on)은 지오로케이션 정보에 접근 할 수 있습니다.
파 이어폭스는 구글 로케이션 서비스를 사용해서 사용자의 WiFi 정보를 기반으로 사용자 위치를 지원하는 기능을 포함하고 있습니다. 파이어폭스와 구글 간의 트랜잭션에는 엑세스 토큰(2 week cookie와 비슷한) 과 사용자 IP 주소 같은 WiFi 엑세를 포인트 정보를 포함하는 데이타를 주고 받습니다. 이 정보가 어떻게 사용되는 지에 대한 보다 많은 정보는 Mozilla's Privacy Policy 와 Google's Privacy Policy 를 확인 하십시요.
리눅스 파이어 폭스 3.6 (게코 1.9.2)에는 지오로케이션을 위한 GPSD (GPS daemon) 서비스를 사용하기 위해 지원이 추가 되었습니다.
The watchPosition method retrieves periodic updates about the current geographic location of the device. The location is expressed as a set of geographic coordinates together with information about heading and speed.
The location information is returned in a Position object. Each update returns a new Position object.
showLocation : This specifies the callback method that retrieves the location information. This method is called asynchronously with an object corresponding to thePosition object which stores the returned location information.
ErrorHandler : This optional paramter specifies the callback method that is invoked when an error occurs in processing the asynchronous call. This method is called with thePositionError object that stores the returned error information.
options : This optional paramter specifies a set of options for retrieving the location information. You can specify (a) Accuracy of the returned location information (b) Timeout for retrieving the location information and (c) Use of cached location information .
Return value:
The watchPosition method returns a unique transaction ID (number) associated with the asynchronous call. Use this ID to cancel the watchPosition call and to stop receiving location updates.
Example:
<!DOCTYPE HTML>
<head>
<script type="text/javascript">
var watchID;
var geoLoc;
function showLocation(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
alert("Latitude : " + latitude + " Longitude: " + longitude);
}
function errorHandler(err) {
if(err.code == 1) {
alert("Error: Access is denied!");
}else if( err.code == 2) {
alert("Error: Position is unavailable!");
}
}
function getLocationUpdate(){
if(navigator.geolocation){
// timeout at 60000 milliseconds (60 seconds)
var options = {timeout:60000};
geoLoc = navigator.geolocation;
watchID = geoLoc.watchPosition(showLocation,
errorHandler,
options);
}else{
alert("Sorry, browser does not support geolocation!");
}
}
</script>
</head>
<html>
<body>
<form>
<input type="button" onclick="getLocationUpdate();"
value="Watch Update"/>
</form>
</body>
</html>
I've been working with PhoneGap and it's been great, but I've run into a problem with getting location on a Verizon Droid w/ 2.0.1 (works as expected on a G1 w/ 1.6).
GeoLocation API Support was added to Android in 2.0 (Eclair) and it works in the default browser on a Verizon Droid (on 2.0.1). That is, if I visit a website that calls navigator.geolocation.getCurrentPosition(success_callback, error_callback), the device prompts that the current domain "wants to know your location" in a dialog with options to "Share location" or "decline". If I select "Share location", success_callback eventually gets called with location data.
If I visit the same website in a WebView, the call to navigator.geolocation.getCurrentPosition does not generate a javascript error, but the "share your location" dialog is not displayed and neither callback ever gets called. In logcat, I see what seems to be a related error: "02-15 10:37:00.413: ERROR/geolocationService(16871): Caught security exception registering for location updates from system. This should only happen in DumpRenderTree."
It seems to me that the WebView is failing to register for location updates because it does not have the required permission, which in turn is a result of not prompting the user for the permission. Although there were several methods and objects added to the Webkit package in Android 2.0 related to GeoPermissions, I haven't been able to use any of them to cause WebView to display the GeoPermission dialog.
The following is based on the Hello, WebView example from the Android Developer's Guide but it adds some of the calls and objects that were added in 2.0 related to GeoPermissions. *Updated with an appropriate url (with permission from the author - thanks Oliver!).
Has anyone been able to get this working? Any feedback would be great, thanks!
package com.example.android.helloactivity;import android.app.Activity;import android.os.Bundle;import android.webkit.GeolocationPermissions;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.GeolocationPermissions.Callback;publicclassHelloActivityextendsActivityimplementsGeolocationPermissions.Callback{WebView webview;String geoWebsiteURL ="http://maxheapsize.com/static/html5geolocationdemo.html";publicHelloActivity(){}/**
* Called with the activity is first created.
*/@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
webview =(WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setGeolocationEnabled(true);//seems like if i set this, the webview should prompt when I call navigator.geolocation.getCurrentPositionGeolocationPermissions geoPerm =newGeolocationPermissions();//added in API Level 5 but no methods exposed until API level 7GeoClient geo =newGeoClient();
webview.setWebChromeClient(geo);String origin ="";//how to get origin in correct format?
geo.onGeolocationPermissionsShowPrompt(origin,this);//obviously not how this is meant to be used but expected usage not documented
webview.loadUrl(geoWebsiteURL);}publicvoid invoke(String origin,boolean allow,boolean remember){}finalclassGeoClientextendsWebChromeClient{@Overridepublicvoid onGeolocationPermissionsShowPrompt(String origin,Callback callback){// TODO Auto-generated method stubsuper.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin,true,false);}}}
I just tried your code on a Nexus One with Android 2.1, and it works fine. Remember that you'll need to add the necessary permissions to your manifest: