强制Android SDK LocationManager提供当前位置

时间:2017-08-09 17:38:14

标签: android gps

我遇到的问题是LocationManager没有提供最后一个已知位置而没有更新位置。 代码已经工作,并且在某些条件下仍然有效。简而言之,我执行以下操作,是的,我已设置所有权限,并且已激活GPS和WLAN。

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    try {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    } catch(SecurityException e ) {
        Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
    }
}
if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    try {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    } catch(SecurityException e ) {
        Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
    }
}
if (locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) {
    try {
        locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListener);
    } catch(SecurityException e ) {
        Log.d("GPS", "Security Exception: " + e.getLocalizedMessage());
    }
}

locationListenerLocationListener接口的简单实现,只存储onLocationChanged(Location location)提供的位置,并通过Log.d("GPS", location.getProvider()+" "+location.toString());打印出来以进行调试。

如果手机很长一段时间没有使用GPS(我还没知道确切要经过多长时间),它将无法通过locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)提供位置(它会返回null它不会打电话给我locationListener。我等了大约30分钟,但没有更新。

另一方面,当我打开谷歌地图(例如在浏览器中)时,我会立即获得一个位置,当我打开我的应用程序时,我也会获得位置更新。

那么其他应用程序如何强制Android提供新位置?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以通过条件选择最佳提供商。而不是如果条件使用下面的代码。查看更多详情https://blog.codecentric.de/en/2014/05/android-gps-positioning-location-strategies/

locationManager.requestLocationUpdates(getProviderName(), 0, 0, locationListener);


String getProviderName() {
    LocationManager locationManager = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    criteria.setPowerRequirement(Criteria.POWER_LOW); // Chose your desired power consumption level.
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Choose your accuracy requirement.
    criteria.setSpeedRequired(true); // Chose if speed for first location fix is required.
    criteria.setAltitudeRequired(false); // Choose if you use altitude.
    criteria.setBearingRequired(false); // Choose if you use bearing.
    criteria.setCostAllowed(false); // Choose if this provider can waste money :-)

    // Provide your criteria and flag enabledOnly that tells
    // LocationManager only to return active providers.
    return locationManager.getBestProvider(criteria, true);
}