【问题标题】:Can't able get bytes from native google document from File Chooser using Intent.ACTION_GET_CONTENT无法使用 Intent.ACTION_GET_CONTENT 从文件选择器的本地 google 文档中获取字节
【发布时间】:2017-09-21 09:31:00
【问题描述】:

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

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

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

有时它会抛出 PermissionDeniel 异常。

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

activity.getContentResolver().openInputStream(contentUri)

非常感谢您的建议。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    Android 有一个Reading Files in Drive API

    打开文件内容

    为了能够读取文件,您必须首先在 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();
        }
    };
    

    【讨论】:

    • 谢谢@noongui。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多