我没有找到一个要求与我相同限制的帖子。
我有一个应用程序,它向其他应用程序(称为客户端应用程序)提供内容提供程序(称之为主应用程序)。我想限制从客户端应用程序访问内容提供程序,仅支持 insert 和查询方法。
我不想要的东西:
我看到的最明显的解决方案是编写两个内容提供程序,一个具有主应用程序的完全访问权限,另一个受限公共。但我认为这绝对不是一种正确的方法。
根据这个Google groups post,我想在内容提供商调用中使用Binder.getCallingUid()
来检测调用是否来自主应用程序。因此,如果调用不是来自主应用程序,我无法在更新和删除方法中执行任何操作。
如何让主应用程序 UID 进行比较?如果有可能,这个解决方案是否安全?
感谢您的建议。
答案 0 :(得分:8)
使用protectionLevel签名定义如下所示的权限,此WRITE权限仅限于使用相同私钥签名的应用
<permission android:name="com.yourapp.WRITE.PERMISSION"
android:protectionLevel="signature"
android:label="@string/permission_label"
android:description="@string/permission_desc">
</permission>
<permission android:name="com.yourapp.READ.PERMISSION"
android:label="@string/permission_label"
android:description="@string/permission_desc">
</permission>
然后在contentprovider标签中使用读写权限标签。 您可以强制执行读取权限,也可以将其全部删除
android:readPermission="com.yourapp.READ.PERMISSION"
android:writePermission="com.yourapp.WRITE.PERMISSION"
因此,只有使用相同签名签名的应用才能使用您的内容提供商
编辑:
也许你可以使用这个
private Collection<String> getCallingPackages() {
int caller = Binder.getCallingUid();
if (caller == 0) {
return null;
}
return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller));
}
并检查此列表中是否包含您的包名称。我认为这是安全的