2016-05-04 12 views
0

私のアプリで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); 
} 

誰でも、場所の更新を迅速に行うための良い修正がありますか?

ありがとうございます。

+0

固定されている衛星に依存します。 GPSは少なくとも3-4個の衛星を固定する必要がありました。あなたが空を開いている場合は、GPSを使用してより速い位置を得ることが可能です –

+0

ありがとうございました。 – Prexx

+0

これはコードとは全く関係ありません。天気が良くない、屋内にいる、GPSが弱い場所にいるなど、GPSの信号がGPSの位置を把握するのに時間がかかる場合があります。この問題を解決するために何もできません。 –

答えて

1

GPSロックを取得するのに要する時間は、信号強度によって異なります。しかし、あなたが "より速く"見えるようにするために実装できるいくつかのことがあります。

は、次の3つの異なるプロバイダのタイプがあります。

PASSIVE_PROVIDER

非常に高速なロック

エキストラ電力要件

低精度を(多くのワイヤレスアクセスポイントを持つ地域でない限り) - 〜1マイル

NETWORK_PROVIDER

かなり正確迅速な初期の修正を取得するために

超低消費電力をGPS +セルネットワークを使用します - 〜100〜200フィート

GPS_PROVIDER

は、GPSやニーズを使用します修正を得るのに長い時間がかかる

非常にaccu速度 - 〜10 - 20ft

これで、最低精度を最高精度で確認し、地図上の位置を特定することができます。ただし、ネットワークまたはプロバイダのアクセスが利用可能かどうかを確認するには、デバイスを確認する必要があります。あなたは、さらにアウトズームレベルになり、その後、再センタリング、あなたがより良い修正を取得しようとして、円滑な移行のためにズームインできUIでこれを表現する

LocationManager.getProviders(boolean enabledOnly)  
    LocationManager.isProviderEnabled(String provider) 

一つの方法を使用してこれを行うことができます。

私が気づいたもう1つのことは、地図を作成した後にあなたの許可を要求していることです。非同期ロードなので、地図がロードされている間にLocationManager GPSのピンポイントを開始することができます。これは、コードのonCreate部分で行うことができます。

+0

この情報はありがとうございます。がんばります :) – Prexx

関連する問題