AndroidでLocationManagerを使うのに困っています。すべての LocationProvider の getLastKnownLocation からのロケーションは、正確さが十分ではありません。私の携帯電話、Galaxy S3 では、LocationProvider の getLastKnownLocation メソッドを使用すると、'network' と 'passive' が場所を教えてくれます。私の電話では「gps」が無効になっています。場所は..
ネットワーク --> 緯度: XX.5511981、経度: XXX.1284714 パッシブ --> 緯度: XX.5511981、経度: XXX.1284714
どちらも同じ位置情報を提供します。しかし、場所は非常に間違っています。約50Kmの位置違いです。
その間、私は電話で Google マップ アプリを実行し、正確な位置情報を報告します。Google マップ アプリは、どのようにして私のアプリよりも正確な位置情報を取得できますか?
PS。「0」minTimeと「0」minDistanceを提供するすべての場所のLocationListnersを登録しました。しかし、私の電話は、数 10 分間、場所の変更をまったく報告しません。その間、電話は机の上に置かれたままだったので、この動作は許容できると思います。ただし、この条件は Google マップ アプリでも同じです。電話の位置を正確に報告します。
アップデート。コードを Galaxy S2 でテストしました。この場合、3 つのプロバイダーの getLastKnownLocation(GPS, NETWORK, PASSIVE) を要求しました。すべての場所が null でした。そして、すべてのプロバイダーに LocationListeners を登録しました。何も報告しませんでした。しかしその間、Google マップ アプリは携帯電話の正確な位置を示してくれました。すばらしい!。Google マップ アプリはどこから位置情報を取得しますか?. 以下は私のテストコードです。
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
Log.i("location","location chagned x:"+location.getLatitude()+" y:"+location.getLongitude()+" prov:"+location.getProvider());
Date d = new Date(location.getTime());
Log.i("location","date:"+d);
}
public void onProviderDisabled(String provider)
{
Log.i("location","disable:" +provider);
}
public void onProviderEnabled(String provider)
{
Log.i("location","Enable:" +provider);
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
Log.i("location","onStatusChanged:" +provider);
}
};
LocationListener locationListenerPassive = new LocationListener() {
public void onLocationChanged(Location location) {
Log.i("location","location chagned x:"+location.getLatitude()+" y:"+location.getLongitude()+" prov:"+location.getProvider());
Date d = new Date(location.getTime());
Log.i("location","date:"+d);
}
public void onProviderDisabled(String provider)
{
Log.i("location","disable:" +provider);
}
public void onProviderEnabled(String provider)
{
Log.i("location","Enable:" +provider);
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
Log.i("location","onStatusChanged:" +provider);
}
};
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
Log.i("location","location chagned x:"+location.getLatitude()+" y:"+location.getLongitude()+" prov:"+location.getProvider());
Date d = new Date(location.getTime());
Log.i("location","date:"+d);
}
public void onProviderDisabled(String provider)
{
Log.i("location","disable:" +provider);
}
public void onProviderEnabled(String provider)
{
Log.i("location","Enable:" +provider);
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
Log.i("location","onStatusChanged:" +provider);
}
};
void showDebug(String provider)
{
Location location = lm.getLastKnownLocation(provider);
if(location!=null)
{
Log.i("location","all location provider:"+provider+" x:"+location.getLatitude()+" y:"+
location.getLongitude()+" actually provider:"+location.getProvider()+" accuracy:"+location.getAccuracy()+" time:"+location.getTime());
Date d = new Date(location.getTime());
Log.i("location","date:"+d);
if(this.current==null)this.current=location;
else if(this.current!=null && isBetterLocation(location,this.current))this.current=location;
}
else Log.i("location","all location provider:"+provider);
}
void start()
{
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
lm.removeUpdates(locationListenerNetwork);
lm.removeUpdates(locationListenerPassive);
lm.removeUpdates(locationListenerGps);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0, 0, locationListenerNetwork);
lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListenerPassive);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
showDebug(LocationManager.NETWORK_PROVIDER);
showDebug(LocationManager.PASSIVE_PROVIDER);
showDebug(LocationManager.GPS_PROVIDER);
}