在 android 清单文件中,我添加了以下 GPS 访问位置的权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我正在使用位置管理器类进行如下位置更新

 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
 locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    MIN_TIME_BW_UPDATES,
                    MIN_DISTANCE_CHANGE_FOR_UPDATES, 
                    this
                );

但上面的行给出了一个例外说明

"gps" location provider requires ACCESS_FINE_LOCATION permission

这种情况只发生在 targetSDKVersion 23(即 android 6.0)上,我也在 android 5.1 中进行了测试,效果很好。

请帮忙!!提前致谢。

答案

从 6.0 开始,某些权限被视为"危险"(FINE_LOCATION 就是其中之一)。

为了保护用户,他们必须在运行时获得授权,以便用户知道这是否与他的操作有关。

去做这个 :

 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

它将显示一个对话框,用户可以在其中选择是否授权您的应用程序使用位置。

然后使用此函数获取用户答案:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
        return;
        }
            // other 'case' lines to check for other
            // permissions this app might request
    }
}

如果用户接受一次,那么您的应用程序将记住它,您将不再需要发送此对话框。

public boolean checkLocationPermission()
{
    String permission = "android.permission.ACCESS_FINE_LOCATION";
    int res = this.checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);
}

Android 文档中对此进行了全部解释:http://developer.android.com/training/permissions/requesting.html

来自: stackoverflow.com