TBr*_*s42 5 android android-contentprovider
我有一个导出的内容提供商,在我的几个应用程序之间共享,第三方可以在我发布API后自由编写自己的应用程序.
现在,任何客户端应用程序都可以对内容提供程序中的任何项目执行任何CRUD操作.我想强制执行一些访问权限,以便应用程序只能修改或删除它创建的项目,同时仍然允许任何应用程序读取提供程序中的所有项目并创建新项目.
有没有什么办法可以访问调用应用程序的UID并将其与新创建的项目一起存储,然后在未来的操作中与该值进行比较?使用包名称会更好吗?我假设如果用户卸载并重新安装了应用程序,UID可能会发生变化,我不希望他们失去对这些项目的访问权限.
是的,您可以进行包名称检查。以下是如何根据调用 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));
}
Run Code Online (Sandbox Code Playgroud)
这会返回包名称列表,因为引用文档:
在大多数情况下,这将是单个包名称,即已分配该用户 ID 的包。
如果有多个包通过“sharedUserId”机制共享相同的用户 id,则将返回具有该 id 的所有包。