, 나는 액세스 할 위치의 두 가지 방법으로 시도했습니다 내 장치에서 같은 시간에 표시하는 것보다 훨씬 덜 정확 :구글지도 앱이 내 응용 프로그램에서
를 A)을 locationManager 및 GPS_PROVIDER 사용 . 정확도가 50 이하인 경우 처리 할 위치를 수락합니다. 앱은 위치 정보를 받지만 대부분의 시간에는 위치 정보가 제공되지 않습니다. Google지도를 사용하여 시작하면 내 위치 정보가 내 앱보다 정확하고 정확합니다. 위치를들을 수
시작 :
// in service class, function to start listening for locations.
// class implements android.location.LocationListener interface
this.locman = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
if(!this.locman.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Log.d("","GPS is not enabled");
}else{
this.locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
this.onLocationChanged(this.locman.getLastKnownLocation(LocationManager.GPS_PROVIDER));
}
onLocationChanged 기능의
android.location.LocationListener 구현 : 매니페스트
@Override
public void onLocationChanged(Location location)
{
... showing provided Location on the map
}
다음은이 관련된 소스의 일부입니다 파일 :
<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_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
이것은 상대적으로 빈번한 업데이트를 줄 수 있지만 때로는 큰 차이가 있습니다. 충분한 위성과 연결하는 것이 문제 일 수 있다고 생각하지만, 동시에 Google지도를 열면 완벽하게 작동합니다. 위치 업데이트 사이에 시간 차이가 없으며 여기에있는 것보다 더 정확합니다.
Google Play API에 정밀도를 향상시키는 내부 보간/예측/기타가있을 수 있으므로 LocationClient 및 LocationRequest를 대신 사용해야한다고 생각했습니다.
b) LocationClient 및 LocationRequest와 함께 GooglePlay API 사용. Google Play SDK를 설치했으며 Google의 샘플 앱을 사용해 보았습니다. onConnected의
// in service class, function to start listening for locations.
// class implements com.google.android.gms.location.LocationListener,
// com.google.android.gms.common.ConnectionResult.OnConnectionFailedListener and
// com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks interface
this.locclient = new LocationClient(this.getApplicationContext(),this,this);
this.locclient.connect();
구현 : - onConnected가 호출되는 동안,에 도착하지
@Override
public void onConnected(Bundle dataBundle)
{
LocationRequest req = LocationRequest.create();
req.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
req.setInterval(2000); // 2 sec
req.setFastestInterval(16); // 60 fps
this.locclient.requestLocationUpdates(req, this);
}
그리고 물론
이 onConnectionFailed 및 onDisconnected 구현 및 breakpointed 여기이 관련 내 코드입니다. com.google.android.gms.location.LocationListener의구현 :이 경우
@Override
public void onLocationChanged(Location location)
{
... showing provided Location on the map
}
, 나는 그러나 200m 이상의 등에 떨어져, 즉시 업데이트를.
필사적으로 Google Play에있는 MyLocation 앱을 사용해 보았는데 동일한 오프셋이 표시되었습니다!
동시에 Google지도를 사용하면 5-6m와 같은 절대 정확도가 표시됩니다.
중요 공지 사항 : 저는 중국 상해에 있습니다. 이것이 어떤 식 으로든 관련이 있는지 확실하지 않습니다.
Google지도와 Google의 자체 위치 서비스 예제 (google_play_services/samples/maps /에서 제공되는 MyLocationDemoActivity.java) 사이에 어떻게 큰 차이가있을 수 있습니까 ?? Google Play 서비스 샘플 코드와 함께 제공되는 Google의지도 데모는 내 실제 위치와 동일한 오프셋 (~ 200m) 거리를 보여 주며 동시에 Google지도 앱은 정확한 위치를 보여줍니다.
개발 플랫폼으로 Nexus 4를 사용하고 있습니다.
컴파일러는 ADT (Eclipse)입니다. 모든 최신 정보.
정말 빨리 돌파구를 기대합니다 !!! 미리 감사드립니다!
P.
위치 요청에 대한 설정으로 LocationRequest.PRIORITY_NO_POWER를 사용하려고 시도했습니다. 다른 앱이 요청한 경우에만 내 앱이 위치 업데이트를 받도록했습니다. 그런 다음 Google지도를 시작하고 내 앱으로 다시 전환했습니다. 그것은 즉시 위치를 받았다. 내가 시험해보기 위해 long/lat를 http://maps.googleapis.com/maps/api/staticmap?center=31.229179,121.422615&zoom=16&format=png&sensor=false&size=640x640&maptype=roadmap에 복사했는데 동일한 오프셋을 보여줍니다. 휴대 전화의 Google지도에서 정확한 위치를 표시합니다.
Google지도의 오프셋이 가능합니까? 또는 long/lat 오프셋을 받았습니까?
내가 해결할 수있는 유일한 해결 방법은 long/lat 오프셋 보정을 추가하는 것이 었습니다. 최소한 상하이에서 테스트 할 수있는 위치는 다음과 같습니다. double long_off = 0.004535; double lat_off = -0.001779; 나는 실내 (커피 숍 등)뿐만 아니라 광장 (거리, 광장)에서 (alot) 주위를 산책하여 이것을 테스트했습니다. 앱에서받은 long/lat에이 오프셋을 추가하면 http : //maps.googleapis.com/maps/api/staticmap .......에서지도를 열고 올바른 위치를 볼 수 있습니다. 그러나 이것은 실제 해결책과는 거리가 있습니다. – Sinisa