【问题标题】:android marshmallow: how to know if user deny one app permissions? [duplicate]android marshmallow:如何知道用户是否拒绝一个应用程序权限? [复制]
【发布时间】:2017-02-07 12:06:53
【问题描述】:

在 Android 上,我检查是否使用

启用了位置
LocationManager.isProviderEnabled(GPS_PROVIDER) || LocationManager.isProviderEnabled(NETWORK_PROVIDER)

这项工作正常,但是在棉花糖(及更高版本)上,当用户进入应用程序设置并仅拒绝我的应用程序使用该位置的权限(仅适用于我的应用程序,如 mashmallow 现在允许这样做)然后是前一个请求仍然返回true

我也试试:

MyActivity.checkSelfPermission('android.permission.ACCESS_FINE_LOCATION') == PERMISSION_GRANTED or MyActivity.checkSelfPermission('android.permission.ACCESS_COARSE_LOCATION') == PERMISSION_GRANTED

但即使用户拒绝我的应用程序的权限,它也总是返回 true

【问题讨论】:

  • 您的targetSdkVersion 设置为什么?
  • 到 14(我现在不能增加它)但通常没关系,不是吗?因为 checkSelfPermission 仅在 api 23 上引入,所以如果 targetSdkVersion

标签: android android-6.0-marshmallow android-permissions


【解决方案1】:

确保在 build.gradle 中将 compileSdkVersiontargetSdkVersion 设置为 23。如果低于23,应用将使用旧的权限方式,你提到的方法将不起作用。

【讨论】:

  • 感谢 kelevandos,但为什么这不适用于 targetSdkVersion
  • 向后兼容,他们不想破坏旧的权限处理。他们仍然有点,但很好 xD
  • 为什么向后兼容?因为 checkSelfPermission 是在 api 23 上引入的,所以它们不需要向后兼容?
  • 但是你仍然希望在 23 岁之前开发的应用程序在 23 岁以上安装时可以工作:-) 所以新方法有点“包装”旧的,假设总是给予权限:-)
【解决方案2】:

请参考link。确保您有 compileSdkVersion 应该是 23 岁及以上。

在这里我创建了检查多个运行时权限的代码,应该显示合理。

【讨论】:

  • 是的 compileSdkVersion 是 23(否则我将无法访问我认为的 checkSelfPermission)
【解决方案3】:

试试下面的代码:

ContextCompat.checkSelfPermission(thisActivity,   Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED

【讨论】:

  • 是的,对不起,我错误地复制过去,我做 == 而不是 = 但总是返回 true :(
【解决方案4】:

checkSelfPermission 不返回布尔值。它返回一个整数。

这是检查权限的正确方法:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {

    // permission is not granted, request it
    ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

} else {    
    //permision granted
}

这是处理它们的方法

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
            // 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
    }
}

来自文档

https://developer.android.com/training/permissions/requesting.html

【讨论】:

  • 是的,我就是这样做的:MyActivity.checkSelfPermission('android.permission.ACCESS_FINE_LOCATION') == PERMISSION_GRANTED 但即使用户拒绝权限它也会返回 true :(
  • 您是否尝试过从 ContextCompat 而不是 MyActivity 调用它。你能告诉我们你的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2013-05-12
  • 1970-01-01
  • 2018-01-09
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多