在安卓设备上检查运行时权限

3

我使用 ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION); 来检查我的应用是否有位置权限。这个方法返回 PackageManager.PERMISSION_GRANTED,这是正确的答案。现在我去我的应用设置中禁用了位置权限。现在上面的方法仍然返回 PackageManager.PERMISSION_GRANTED,但它应该返回 PackageManager.PERMISSION_DENIED。有人能给我一些想法吗?如果我可以使用另一个方法,那么它是什么?


你正在onCreate或onResume中检查此状态。 - Vishal Thareja
你能发一下你的代码吗?我的意思是,onRequestPermissionsResult的代码。 - Mani
@ankit 是的,我正在使用 marshmallow 设备。 - Homen
@Homen 这种情况可能是因为您没有杀死应用程序,然后打开设置并禁用位置权限,再次打开活动,但在onresume中您没有像oncreate一样进行检查,因此它返回true。 - Vishal Thareja
@Homen,你的目标SDK是23还是低于23? - Mani
显示剩余5条评论
2个回答

3

请求权限

if (checkSelfPermission(Manifest.permission.CAMERA) 
        == PackageManager.PERMISSION_DENIED) {
  requestPermissions(new String[]{Manifest.permission.CAMERA}, YOUR_REQUEST_CODE);
}

同时检查用户是否接受了您的请求,覆盖以下代码:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case YOUR_REQUEST_CODE: {
            if (checkSelfPermission(Manifest.permission.CAMERA) == 
PackageManager.PERMISSION_GRANTED){
                // permission was granted
            } else {
                // permission denied
                //Disable the functionality 
                //that depends on this permission.
            }
            return;
        }
    }
}

参考:http://sourabhkarkal.com/blogspot/requesting-permissions-in-android-m/

在Android M及以上版本中,应用程序必须请求与其操作相关的权限。 如果您未请求所需的权限,则应用程序在运行时将无法访问相关功能。为了提高用户体验和安全性,Android M更改了权限模型。
现在,当应用程序尝试访问设备上的受保护功能时,系统会弹出对话框,询问用户是否允许该应用程序使用所需的权限。如果用户禁止权限,则应用程序无法访问对应功能。
因此,在Android M及以上版本中,您需要动态请求权限。本文将介绍如何在Android M及以上版本中申请权限。

1
我也在使用这段代码。但是在应用程序设置中禁用权限后,它返回PackageManager.PERMISSION_GRANTED。禁用后应该是PackageManager.PERMISSION_DENIED,不是吗? - Homen
在您的 Activity 的 onResume() 方法中执行 checkSelfPermission(),并告诉我结果。 - Auto-Droid ツ

1
根据您的评论,目标sdk为22。因此,方法checkSelfPermission始终会授予您Granted权限。如果您想要实现运行时权限,则必须将其更改为23。
如果您想要详细答案,请参考SO问题。阅读所有评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接