Android M-无法检查运行时权限

Android M-无法检查运行时权限,android,permissions,android-manifest,android-6.0-marshmallow,Android,Permissions,Android Manifest,Android 6.0 Marshmallow,我刚刚开始在Android M上使用运行时权限。我在AndroidManifest.xml中声明了CAMERA、READ_EXTERNAL_存储和WRITE_EXTERNAL_存储 问题是,如果用户转到“设置”并按如下所示明确关闭权限,我无法检查我的应用程序是否启用了摄像头或存储权限 我使用此代码段检查我的应用程序是否具有特定权限: public static boolean hasPermission(Context c, String permission) { if (Build

我刚刚开始在Android M上使用运行时权限。我在AndroidManifest.xml中声明了CAMERA、READ_EXTERNAL_存储和WRITE_EXTERNAL_存储

问题是,如果用户转到“设置”并按如下所示明确关闭权限,我无法检查我的应用程序是否启用了摄像头或存储权限

我使用此代码段检查我的应用程序是否具有特定权限:

public static boolean hasPermission(Context c, String permission) {
    if (Build.VERSION.SDK_INT >= 23) {
        return ContextCompat.checkSelfPermission(c, permission) == PackageManager.PERMISSION_GRANTED;
    }
    return true;
}
令人惊讶的是,即使我在设置中关闭了摄像头和存储权限,每次检查都会返回true(已授予)

我的
targetSdkVersion
是23


这是谷歌提供的预期行为吗?我环顾了一下web,仍然找不到任何文档说明显式调用权限的句柄。

再次检查onRestart()中的权限

有关更多信息,请查看此链接:
你需要做不同的事情

首先,请求许可您试图执行的操作。摄像机示例:

//This is a class variable
private final static int MY_PERMISSIONS_REQUEST_CAMERA = 1;

...

// before use camera:
// check permissions for CAMERA
if (ContextCompat.checkSelfPermission(ActivityName.this,
        Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {

    //request permission
    ActivityCompat.requestPermissions(ActivityName.this,
            new String[]{Manifest.permission.CAMERA},
            MY_PERMISSIONS_REQUEST_CAMERA);

} else {
    //permissions granted, do wahtever with camera
    functionToHandleCamera();
}
然后您需要处理用户响应:允许或拒绝。所以重写onRequestPermissionsResult方法

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //permissions granted, do wahtever with camera
                functionToHandleCamera();

            } else {
                // permission denied
                Toast msg = Toast.makeText(this, "PERMISSIONS NEEDED", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.CENTER, 0, 0);
                msg.show();
            }
            return;
        }

    }
}
更多信息:


编辑:如果您只想检查权限是否被授予,您只需要我编写的第一部分代码。

将此添加到您的
onCreate
活动方法中:-

if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

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

        }
    }
和覆盖此方法:-

@Override

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

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } 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
    }
}

您必须更改targetSDKVersion,因为

即使用户在“设置”中关闭了该权限组,您也应该为低于23的任何targetSdkVersion授予权限。我建议您完全卸载该应用程序,将targetSdkVersion设置为23,然后重试


你可以检查这个

你的
targetSdkVersion是什么
?我的目标是SDK 23你测试的是什么版本的Android?现在,您只能在23+上调用
checkSelfPermission()
ContextCompat.checkSelfPermission()
可以在任何版本的Android上调用(至少返回到API级别4),因此我会删除
如果
检查。您的屏幕截图看起来像是API级别23的设备,在这种情况下,如果您的
targetSdkVersion
是23,我无法解释您的症状。我在运行Android M的设备上进行了测试,我确实在代码上设置了断点来跟踪它,它运行了
ContextCompat.checkSelfPermission()
function我目前面临同样的问题(权限检查始终显示即使在权限被撤销后也已授予),您最近找到解决方案了吗?我运行了检查,转到“设置”关闭权限,然后返回到我的应用程序再次运行检查。我不认为这是一个有效的回答你必须再次检查许可我不明白你的意思,我在设置打开时检查,在设置关闭时再次检查。在我遇到的每一种情况下,它都会在onRestart()方法中返回true(授予的权限)-->onStart()-->onResume()在从设置中按下后退按钮时被调用,并且用户可以看到我们的应用程序,因此我们需要在onRestart()方法中再次检查是否授予了权限。Sagar是正确的。在正常情况下,你的应用程序应该按照他所描述的方式运行。是的,我明白了,我首先需要检查我的许可是否被授予,如果没有,我会要求。不幸的是,正如我在问题中所说的,返回的结果始终为真(已授予),因此我的代码不会运行到请求权限。我将对该答案进行评论,正如我对上述答案的评论一样。并不是我不知道如何请求权限,而是它总是返回true,表示权限已被授予,那么我究竟如何跳转到请求您上面引用的权限的代码块?
@Override

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

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } 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
    }
}