android - 无法使用 Intent.ACTION_GET_CONTENT 从文件选择器的 native 谷歌文档中获取字节

标签 android android-contentprovider android-contentresolver google-drive-android-api

这里是内容提供商新手。 我正在尝试使用下面的 Intent 选择器从谷歌驱动器打开文档

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");   
Intent intent = Intent.createChooser(intent, "Import Document");

我可以从 docx、image 和 pdf 等文件中获取字节,但在尝试打开 native google 文档时,我收到 FileNotFoundException 以及文件是虚拟文件等信息。

有时它会抛出 PermissionDeniel 异常。

我正在使用以下方法读取字节

activity.getContentResolver().openInputStream(contentUri)

非常感谢您的建议。

谢谢。

最佳答案

有一个 Reading Files in Drive API适用于 Android。

打开文件内容

为了能够读取文件,您必须首先以 DriveFile.MODE_READ_ONLYDriveFile.MODE_READ_WRITE 模式打开其 DriveContents 资源,具体取决于您是否喜欢使用 InputStream 或 ParcelFileDescriptor 类。

注意:InputStream 类仅适用于以 READ_ONLY 模式打开的文件。使用 READ_WRITE 打开的文件必须使用 ParcelFileDescriptor 类从文件中读取。

DriveFile.open 方法检索本地同步的文件资源并打开它。如果文件未与本地存储同步,它会从 Drive 服务检索文件并返回 DriveContents 资源。例如:

DriveFile file = ...
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
        .setResultCallback(contentsOpenedCallback);

DriveContents 资源包含文件二进制流的临时副本,仅供您的应用程序使用。如果多个应用程序正在访问同一个文件,则 DriveContents 资源之间不存在竞争条件。在这种情况下,最后的写入操作将是内容的最终状态。

处理响应需要您检查调用是否成功。如果调用成功,您可以检索 DriveContents 资源。此资源包含检索 InputStream 或 ParcelFileDescriptor 以读取文件的二进制内容的方法。以下示例演示了如何检索文件的 DriveContents:

ResultCallback<DriveContentsResult> contentsOpenedCallback =
        new ResultCallback<DriveContentsResult>() {
    @Override
    public void onResult(DriveContentsResult result) {
        if (!result.getStatus().isSuccess()) {
            // display an error saying file can't be opened
            return;
        }
        // DriveContents object contains pointers
        // to the actual byte stream
        DriveContents contents = result.getDriveContents();
    }
};

关于android - 无法使用 Intent.ACTION_GET_CONTENT 从文件选择器的 native 谷歌文档中获取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46340311/

相关文章:

android - 改变 sqlite 表以在多列上添加唯一约束

android - 使内容提供程序仅可用于一个包

Android - APP 附加主题(图像、声音等)

android - 从 Android 内容 URI 获取 FileInputStream(或如何在 InputStream 上查找)

android - 函数在 GLSL 中有性能损失吗?

java - 如何在 Android Studio 中使用 Volley 下载内部存储中的文件?

android - 将自定义 ID 关联到 ListView 项目

android - 如何在 recyclerView 单元格的顶部添加边到边叠加层?

android - 在 Android Java 类中调用 "getContentResolver "

android - 使用服务获取 CallLog 上的最后一次通话