【问题标题】:Determine whether a permission is present in the manifest with Android 23+使用 Android 23+ 确定清单中是否存在权限
【发布时间】:2020-12-03 23:23:13
【问题描述】:

我正在创建一个需要检查运行时权限的库。我的运行时权限工作正常,并且可以毫无问题地理解用例。

但是,我想确认使用我们库的开发人员已将权限添加到他们的清单中。

该库是基于位置的库,开发人员可以在清单中输入ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION,我需要能够确定它们在运行时使用了哪些(或两者都使用)。

我虽然使用包管理器检查权限会起作用,但这似乎总是失败:

PackageManager pm = getPackageManager();
int granted = pm.checkPermission(
                      Manifest.permission.ACCESS_COARSE_LOCATION, 
                      getPackageName() );
if (granted == PackageManager.PERMISSION_GRANTED)
{
    // Use coarse for runtime requests
}
// granted is always PackageManager.PERMISSION_DENIED 

在 Android v23+ 中还有其他方法可以做到这一点吗?

【问题讨论】:

  • 你可以这样做 --- (int hasFineLocation = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION); if (hasFineLocation == PackageManager.PERMISSION_GRANTED) { .... )
  • 这种方法似乎与我列出的方法相同?
  • 哦,是的,抱歉,它不适用于 Android 6.0
  • 好的,如果你检查这个库 (EasyPermissions) github.com/googlesamples/easypermissions --- this (public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { ) 创建一个数组从清单请求的权限。所以它必须在 API 23 中通过代码实现。深入研究演示代码,看看它是如何完成的 --- 哈,我在你接受下面的答案之前写了这个 :))
  • 谢谢你,但是 PackageInfo 有我需要的所有信息,只是不知道。

标签: android android-permissions


【解决方案1】:

立即通过PackageManager and getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS) 检索PackageInfo。然后,查看PackageInfo 中的the requestedPermissions array 以获得所有<uses-permission> 请求的权限。

【讨论】:

  • 啊这看起来正是我所追求的!现在试试。干杯
  • @Michael:我引用的所有内容自 API 级别 1 以来就已存在。requestedPermissions 仅列出清单中请求的内容,不应受运行时权限的影响。
  • 干杯,已经测试并且工作得很好!感谢您为我指明正确的方向。
  • 这对你真的有用吗?我从清单中删除了 uses-permission 子句,我仍然在 requestedPermissions 数组中获得该权限的条目。我对 CAMERA_PERMISSION 感兴趣。我想这没有任何区别,但仍然......
  • @IkerJamardoZugaza:也许是a library is adding that to your manifest
【解决方案2】:

感谢CommonsWare 的回答我创建了这个方法Kotlin 来检查Manifest 上是否存在短信权限

fun hasSmsPermissionInManifest(context: Context): Boolean {

    val packageInfo = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)
    val permissions = packageInfo.requestedPermissions

    if (permissions.isNullOrEmpty())
        return false

    for (perm in permissions) {
        if (perm == Manifest.permission.READ_SMS || perm == Manifest.permission.RECEIVE_SMS)
            return true
    }

    return false
}

fun Context.hasSmsPermissionInManifest(): Boolean {
    val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS)
    val permissions = packageInfo.requestedPermissions

    return permissions?.any { perm -> perm == Manifest.permission.READ_SMS || perm == Manifest.permission.RECEIVE_SMS } ?: false
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多