2016-05-04 144 views
0

我在我的應用中設置了一個LocationManager來定位用戶並顯示其當前位置。 這工作正常,除了太長的開始時間(有時> 10秒)。開始時間之後,服務按預期工作。GPS定位需要很長時間才能啓動

這是一個日誌輸出。第一行是在啓動LastKnownLocation,該LocationService以後18秒開始......

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_COARSE_LOCATIONACCESS_FINE_LOCATION權限。成功(或在API 23以下),方法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鎖定所需的時間取決於信號強度。但是,爲了使其看起來更「快」,您可以執行幾件事情。

你有三個不同的供應商類型:

PASSIVE_PROVIDER

非常快鎖

無需額外的電源要求

準確性低(除非有許多無線接入點的區域) - 〜1英里

NETWORK_PROVIDER

採用GPS +手機網絡來得到一個快速的初始修復

極低功耗

相當準確 - 〜100 - 200英尺

GPS_PROVIDER

使用GPS和需求很長時間才能得到修復

非常精確率 - 〜10 - 20ft

現在,您可以通過檢查最低準確度到最高準確度開始,同時確定它們在地圖上的位置。但是,您必須檢查設備以查看網絡或提供者訪問是否可用。您可以使用在UI來表示此

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

的一種方式可能是一進一出的縮放級別,然後重新定心和放大的平穩過渡,當你試圖獲得更好的修復做到這一點。

我注意到的另一件事是,您在創建地圖後請求您的權限。由於是異步加載,因此您可以在加載地圖時啓動LocationManager GPS精確定位。您可以在代碼的onCreate部分執行此操作。

+0

非常感謝這些信息。我會盡力的 :) – Prexx

相關問題