GPS定位需要很长时间才能启动

时间:2016-05-04 07:35:18

标签: android location

我在我的应用中设置了一个LocationManager来定位用户并显示他当前的位置。 这工作正常,除了太长的开始时间(有时> 10秒)。在开始时间之后,服务按预期工作。

这是一个日志输出。第一行是启动时的LastKnownLocation,位置服务是在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);
}

任何人都有一个很好的解决方案来更快地获得位置更新?

提前致谢。

1 个答案:

答案 0 :(得分:2)

获取GPS锁定所需的时间取决于信号强度。但是,有一些事情你可以实现,以使它看起来更快"。

您有三种不同的提供商类型:

<强> PASSIVE_PROVIDER

非常快速锁定

无额外电源要求

精度低(除非在有许多无线接入点的区域) - 约1英里

NETWORK_PROVIDER

使用GPS +手机网络快速进行初步修复

功率非常低

非常准确 - 约100 - 200英尺

<强> GPS_PROVIDER

使用GPS并需要很长时间才能获得修复

非常准确 - 约10 - 20英尺

现在,您可以通过检查最低精度到最高精度来开始,同时确定它们在地图上的位置。但是,您必须检查设备以查看网络或提供商访问是否可用。您可以使用

执行此操作
    LocationManager.getProviders(boolean enabledOnly)    
    LocationManager.isProviderEnabled(String provider)

在UI中表示这一点的一种方法可能是进一步缩小缩放级别,然后重新居中和放大以便在尝试获得更好的修复时进行平滑过渡。

我注意到的另一件事是,您在创建地图后请求您的权限。由于它是异步加载,因此您可以在加载地图时启动LocationManager GPS精确定位。您可以在代码的onCreate部分执行此操作。