如何在API 23及以下的版本中检查权限?

8

我的一个应用程序拥有RECORD_AUDIO权限,而我的应用程序的targetSdkVersion为22。我无法在运行时检查权限。但我注意到,如果我将我的应用程序安装在Android 6.0及以上版本中,用户可以在“系统应用程序权限设置”中手动拒绝权限。所以我的问题是,在API级别23以下,如何检查我的应用程序是否被允许使用音频权限?

我已经搜索了很长时间,但只找到了一些关于如何在Android M中检查权限的文档

我注意到上下文具有一个函数checkCallingOrSelfPermission,但它在Android 6.0下的行为很奇怪。我正在使用这里的解决方案。但是,当我在“系统应用程序设置”中手动关闭应用程序权限后,得到的结果不是我期望的。

String permission = "android.permission.RECORD_AUDIO";
int ret = context.checkCallingPermission(permission);

忘了提到:
minSdkVersion 9
targetSdkVersion 22

编辑:

我注意到有一个解决方案,就是将v4支持库升级到v23。但是升级v4支持库会比较复杂,所以我想要另一种解决方案。

5个回答

16
在 API 22 及以下版本中:
int permission = PermissionChecker.checkSelfPermission(context, permission);

if (permission == PermissionChecker.PERMISSION_GRANTED) {
    // good to go
} else {
    // permission not granted, you decide what to do
}

在 API 23 及以上版本:

从文档中得知:

如果你的应用需要一个危险权限,那么每次执行需要该权限的操作时,你必须检查是否拥有该权限。用户随时可以撤销权限,因此即使应用昨天使用了相机,也不能假设它今天仍然拥有该权限。

要检查是否拥有权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,以下代码片段展示了如何检查活动是否具有写入日历的权限:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

如果应用程序拥有权限,则该方法返回PackageManager.PERMISSION_GRANTED,应用程序可以继续操作。如果应用程序没有权限,则该方法返回PERMISSION_DENIED,并且应用程序必须明确要求用户授权。

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


我无法在 compile 'com.android.support:support-v4:22.2.1' 使用 ContextCompat.checkSelfPermission,我该怎么办? - einverne
3
哦,我刚刚看到你正在使用目标SDK版本22。这里有一个类似的讨论并提供了答案:https://dev59.com/nVwX5IYBdhLWcg3wwx1S - Apostrofix
PermissionChecker 无法解析。 - einverne
1
@einverne 你是否导入了 android.support.v4.content.PermissionChecker; - Apostrofix
我正在使用 com.android.support:support-v4:22.2.1。我没有这个类。 - einverne
2
那么最好的选择可能是升级到v4。我知道这可能很困难,但这也是明智的未来决定。 - Apostrofix

7
对于Api 22及以下版本,如果我没记错的话,你不需要在运行时检查权限,你只需将它们添加到AndroidManifest中,应用程序将在第一次安装时询问此权限。因此,你可能需要检查一下你的AndroidManifest,请将其添加到这里。
如果你想在Api 23及以下版本上使用你的应用程序:
你可以尝试使用if语句来检查Sdk版本,并在运行时请求危险权限(如果版本为23或更高)。 if (android.os.Build.VERSION.SDK_INT > 23) { /*在此处请求危险权限*/ } 也许这样可以解决Api 22及以下版本的问题。你可以从Requesting Permissions at Run Time中了解如何在运行时请求权限。
此外,你还必须将Api 23编译添加到你的应用程序中,并将目标设置为Api 23。
编辑:现在我看到你提到了升级支持库到v23很复杂,但我不明白为什么。你只需要安装一些SDK并在gradle中添加一些字符串即可。你是否使用类似自定义的支持库?

1

0
请查看此链接,它将指导您如何设置权限并减少实现权限的工作。

0

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