6

多项选择题:

以下哪项可以正确检查应用程序是否具有在其 AndroidManifest.xml 中声明的特定权限?

getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

或者

getContext().getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED

基本上,我对声称的android文档感到害怕checkCallingOrSelfPermission->如果您只是检查它,它就会授予IPC权限?那有什么意思? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

所以任何关于真正差异的解释都会很棒:D

*注意:我在库中提供此代码,因此我只能在运行时检查权限,除非您知道更好的方法。

4

3 回答 3

4

据我了解(这可能是错误的,因为我还没有在 IPC 上工作太多):

鉴于您的代码是从另一个应用程序执行的(例如,您的库没有编译到应用程序中,而是暴露给第三方使用Binder或类似的东西),您可以使用checkCallingPermission检查第三方应用程序是否具有给定的权限,同时checkCallingOrSelfPermission包括来自您的库被编译到的应用程序的权限。

您需要单独处理调用者的权限,因为在检查自己的权限时也可能将权限泄漏给其他应用程序。从安全提示

不要泄露受权限保护的数据。当您的应用程序通过 IPC 公开数据时会发生这种情况,这些数据仅因为它具有特定权限而可用,但不需要其 IPC 接口的任何客户端的权限。

[...]

如果提供确实需要访问控制的接口, checkCallingPermission()请用于验证调用者是否具有所需的权限。这在代表调用者访问服务之前尤其重要,因为您的应用程序的标识会传递给其他接口。

您描述的包管理器方式检查您的库编译到的应用程序的权限。

因此,如果您的代码不是从另一个进程执行的,您可能不必关心差异。否则,如果您对是否可以执行任务感兴趣,请使用包管理器方式或清除调用标识内容;如果您希望检查调用进程是否也可以执行任务,请另外检查调用者的权限。

于 2013-08-23T02:03:23.080 回答
3

您可以使用此方法:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE"
public boolean hasPermission(String permission) 
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                if (p.equals(permission)) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}
于 2013-08-23T01:15:34.353 回答
0

您可以Context.checkCallingorSelfPermission()为此使用功能。这是一个例子

private boolean checkWriteExternalPermission()
{

    String permission = "android.permission.WRITE_EXTERNAL_STORAGE";
    int res = getContext().checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);            
}
于 2017-02-20T14:33:46.963 回答