我有一个导出的内容提供商,在我的几个应用程序之间共享,第三方可以在我发布API后自由编写自己的应用程序。
现在,任何客户端应用程序都可以对内容提供程序中的任何项目执行任何CRUD操作。我想强制执行一些访问权限,以便应用只能修改或删除它创建的项目,同时仍允许任何应用读取提供商中的所有项目并创建新项目。
有什么方法可以访问调用应用程序的UID并将其与新创建的项目一起存储,然后在未来的操作中与该值进行比较?使用包名称会更好吗?我假设如果用户卸载并重新安装了应用程序,UID可能会发生变化,我不希望他们失去对这些项目的访问权限。
答案 0 :(得分:1)
是的,您可以进行包名检查。以下是根据调用uid检索包名称的方法:
private static Collection<String> getCallingPackages(Context context) {
int callingUid = Binder.getCallingUid();
if (callingUid == 0) {
return Collections.emptyList();
}
String[] packages = context.getPackageManager().getPackagesForUid(callingUid);
return new ArrayList<>(Arrays.asList(packages));
}
这将返回一个包名列表,因为引用文档:
在大多数情况下,这将是一个包名称,即已分配该用户ID的包。
有多个包通过共享相同的用户ID &#34; sharedUserId&#34;机制,将返回具有该ID的所有包。