如何处理 Android 6.0 的 ACCESS_FINE_LOCATION 权限?

How to handle ACCESS_FINE_LOCATION permission on Android 6.0?

当我在 Android 版本 6.0 或更高版本的设备上启动 LocationService 时,出现以下错误:

java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations. at android.os.Parcel.readException(Parcel.java:1620) at android.os.Parcel.readException(Parcel.java:1573) at com.google.android.gms.internal.ni$a$a.a(Unknown Source) at com.google.android.gms.internal.nj.a(Unknown Source) at com.google.android.gms.internal.nk.a(Unknown Source) at com.google.android.gms.internal.nf.a(Unknown Source) at com.google.android.gms.internal.nf.a(Unknown Source) at com.google.android.gms.common.api.BaseImplementation$a.b(Unknown Source) at com.google.android.gms.common.api.c.a(Unknown Source) at com.google.android.gms.common.api.c.b(Unknown Source) at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source) at com.google.android.gms.internal.jm.f(Unknown Source) at com.google.android.gms.common.api.c.gJ(Unknown Source) at com.google.android.gms.common.api.c.d(Unknown Source) at com.google.android.gms.common.api.c.onConnected(Unknown Source) at com.google.android.gms.internal.jm.f(Unknown Source) at com.google.android.gms.internal.jm.dU(Unknown Source) at com.google.android.gms.internal.jl$h.b(Unknown Source) at com.google.android.gms.internal.jl$h.g(Unknown Source) at com.google.android.gms.internal.jl$b.hy(Unknown Source) at com.google.android.gms.internal.jl$a.handleMessage(Unknown Source) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5466) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我已经在Manifest.xml中设置了所需的权限!然后我读到权限在 Android 6.0 上有所不同,但是我如何要求用户接受或设置应用程序所需的权限?

有什么建议吗?

首先检查权限是否已经被授予

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.CAMERA}, 108);
        return;
    } else {
        //continueYourTask
}

如果未被授予,它会自动显示一个对话框以授予访问权限,并且在被授予时收到回叫

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 108:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //continueYourTask
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}