Android存储访问框架:从DocumentsProvider访问未报告的内容提供商

Android存储访问框架:从DocumentsProvider访问未报告的内容提供商,android,android-contentprovider,Android,Android Contentprovider,My Storage Access Framework Documents provider正在使用我的应用程序中现有的内容提供商访问一个数据库表,该数据库表存储了我在设备上本地存储的服务器文件的信息。当我从openDocument访问内容提供程序时,这可以正常工作。然而,当我从createDocument访问它时,我得到一个SecurityException:权限拒绝:写入。。。uri。。。要求导出提供程序或grantUriPermission()。使用QuickOffice在“我的文档”提供

My Storage Access Framework Documents provider正在使用我的应用程序中现有的内容提供商访问一个数据库表,该数据库表存储了我在设备上本地存储的服务器文件的信息。当我从openDocument访问内容提供程序时,这可以正常工作。然而,当我从createDocument访问它时,我得到一个SecurityException:权限拒绝:写入。。。uri。。。要求导出提供程序或grantUriPermission()。使用QuickOffice在“我的文档”提供程序中创建新文件时会发生这种情况。我的数据库内容提供程序未导出,因为它仅在应用程序中供内部使用。既然两个提供商都在我的应用程序中,为什么我需要数据库内容提供商的访问权限?除了导出我的数据库内容提供程序之外,还有其他解决方法吗

它基于传入调用方的绑定标识对内部ContentProvider强制执行安全性。传入的调用者具有进入
文档provider
的Uri权限,但当您转身访问第二个内部提供程序时,它会根据其身份拒绝访问,这是应该的

如果您确实知道呼叫者应该有访问权限,您可以暂时释放他们的身份,并恢复到应用程序的正常身份,从而允许您访问您的内部提供商

下面是一个例子:

    // Delegate to real provider
    final long token = Binder.clearCallingIdentity();
    try {
        return getContext().getContentResolver().openFileDescriptor(target, mode);
    } finally {
        Binder.restoreCallingIdentity(token);
    }