如何正确地动态检查Android权限

时间:2013-08-23 01:10:50

标签: android permissions package android-manifest android-context

多项选择题:

以下哪项会正确检查某个应用程序是否在其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

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

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

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

3 个答案:

答案 0 :(得分:4)

根据我的理解(这可能是错误的,因为我对IPC没有太多帮助):

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

您需要单独处理调用者的权限,因为在检查自己的权限时也可能会将权限泄露给其他应用程序。来自security tips

  

不要泄露受权限保护的数据。这适用于您的应用   通过IPC公开数据,因为它具有特定的可用性   许可,但不要求任何客户的许可   它是IPC接口。

     

[...]

     

如果提供需要访问控制的界面,请使用   checkCallingPermission()验证来电者是否有必需   允许。在访问服务之前,这一点尤其重要   代表调用者,作为您的应用程序的标识传递给   其他接口。

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

因此,如果您的代码不是从其他进程执行的,那么您可能不必关心其中的差异。否则,如果您对是否可以执行任务感兴趣,请使用包管理器方式或clear the calling identity stuff;如果你想检查调用进程是否也可以执行任务,另外检查调用者的权限。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您可以使用status = models.CharField(max_length=15, choices=ProjectChoices.PROJECT_STATUSES, default=ProjectChoices.STATUS_STARTED)功能。这是一个例子

Context.checkCallingorSelfPermission()