私のアプリでLocationManagerを設定してユーザーを探し、現在の位置を表示します。 開始時間が長すぎる(時には10秒を超える)場合を除き、これはうまくいきます。開始時間の後、サービスは期待どおりに機能します。GPSのロケートに時間がかかりすぎる
ここにログ出力があります。最初の行は... LocationServiceが後18sec開始され、起動時にLastKnownLocation
ある
05-04 09:14:29.301 23688-23688/xxxxx D/MainActivity: Moving GMaps to location Location[gps x,986175,x,121746 acc=14 et=+2d11h37m45s435ms alt=165.0 vel=0.0 {Bundle[mParcelledData.dataSize=40]}]
[...]
05-04 09:14:47.943 23688-23688/xxxxx D/MainActivity: Moving GMaps to location Location[gps x,986343,x,121702 acc=33 et=+2d11h40m57s443ms alt=149.0 vel=0.25 bear=139.8 {Bundle[mParcelledData.dataSize=40]}]
05-04 09:14:48.940 23688-23688/xxxxx D/MainActivity: Moving GMaps to location Location[gps x,986351,x,121693 acc=30 et=+2d11h40m58s442ms alt=134.0 vel=0.25 bear=139.8 {Bundle[mParcelledData.dataSize=40]}]
05-04 09:14:49.948 23688-23688/xxxxx D/MainActivity: Moving GMaps to location Location[gps x,986373,x,121666 acc=28 et=+2d11h40m59s448ms alt=160.0 vel=0.25 bear=139.8 {Bundle[mParcelledData.dataSize=40]}]
[...]
これは私の現在のコードです:
のonCreate:
SupportMapFragment mapFragment
= (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
onMyMapReady(googleMap);
}
});
onMyMapReady:
private void onMyMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
askPermissionsAndShowMyLocation();
}
});
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mMap.getUiSettings().setAllGesturesEnabled(false);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
}
askPermissionsAndShowMyLocation()
は、を求める簡単な方法ですおよびACCESS_FINE_LOCATION
権限成功した場合(またはAPI23以下の場合)、メソッドshowMyLocation()
が呼び出されます。 (私は私のログに見ることができるように、これは起動時に任意の巨大な遅延なく呼び出されます)
showMyLocation:
private void showMyLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
String locationProvider = this.getEnabledLocationProvider();
if (locationProvider == null) {
dialogCheckGps();
return;
}
Log.d(LOG_TAG, "Location provider: " + locationProvider);
try {
mLocationManager.requestLocationUpdates(
locationProvider,
0,
0, this);
currentLocation = mLocationManager
.getLastKnownLocation(locationProvider);
} catch (SecurityException e) {
Log.e(LOG_TAG, "Show My Location Error:" + e.getMessage());
}
///////////////////
// This is the first log entry from above.
///////////////////
if (currentLocation != null) {
LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, ZOOM_LEVEL));
moveToLocation(currentLocation);
} else {
Log.d(LOG_TAG, "Location not found");
}
}
onLocationChanged(これはすぐに呼び出されなければなりませんが、あなたのように遅れて呼び出されます上記のログに表示されます):
@Override
public void onLocationChanged(Location location) {
moveToLocation(location);
}
誰でも、場所の更新を迅速に行うための良い修正がありますか?
ありがとうございます。
固定されている衛星に依存します。 GPSは少なくとも3-4個の衛星を固定する必要がありました。あなたが空を開いている場合は、GPSを使用してより速い位置を得ることが可能です –
ありがとうございました。 – Prexx
これはコードとは全く関係ありません。天気が良くない、屋内にいる、GPSが弱い場所にいるなど、GPSの信号がGPSの位置を把握するのに時間がかかる場合があります。この問題を解決するために何もできません。 –