2016-05-04 107 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

相关问题