多项选择题:
以下哪项会正确检查某个应用程序是否在其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
*注意:我在库中提供此代码,因此我只允许在运行时检查权限,除非您知道更好的方法。
答案 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()