"gps"位置提供程序需要Android 6.0的ACCESS_FINE_LOCATION权限

bha*_*.cs 27 android

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

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

我正在使用位置管理器类来构建位置更新,如下所示

 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
                );
Run Code Online (Sandbox Code Playgroud)

但上面的一行是一个例外陈述

"gps" location provider requires ACCESS_FINE_LOCATION permission
Run Code Online (Sandbox Code Playgroud)

这个东西只发生在targetSDKVersion 23(即用android 6.0),我也在android 5.1中测试过,工作正常.

请帮助!!.提前致谢.

Seb*_*AND 59

从6.0开始,一些权限被认为是"危险的"(FINE_LOCATION就是其中之一).

为了保护用户,必须在运行时对其进行授权,以便用户知道它是否与其操作相关.

去做这个 :

 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
Run Code Online (Sandbox Code Playgroud)

它将显示一个DialogBox,用户将在其中选择是否自动调整您的应用程序以使用位置.

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果用户接受一次,那么您的应用程序将记住它,您将不再需要发送此DialogBox.请注意,如果他决定,用户可以稍后禁用它.然后在请求位置之前,您必须测试是否仍然授予了权限:

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

这些都在Android文档中进行了解释:http://developer.android.com/training/permissions/requesting.html


Niv*_*edh 6

试试这个代码

private void marshmallowGPSPremissionCheck() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_LOCATION);
        } else {
            //   gps functions.
        }
    }
Run Code Online (Sandbox Code Playgroud)

添加这个也..................

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
        if (requestCode == MY_PERMISSION_LOCATION
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //  gps functionality
        }
    }
Run Code Online (Sandbox Code Playgroud)