首页 > 解决方案 > 如何使用 Google Drive Android API 实例化 DriveId/DriveFolder

问题描述

我确信这是一个容易回答的问题,但我一直无法找到如何使用 Google Drive Android API v 12实例化 aDriveId和/或Drive 资源 ID。DriveFolder

我已经阅读了 Google Drive Android API 文档,并设法从根文件夹中的 Android 应用程序在我的 Google Drive 上创建了一个文件,但现在我想在特定文件夹中创建该文件,但我不确定如何去做这个。

我见过的很多代码(例如这个 Stackoverflow 答案)使用已弃用的 Google从文件夹的资源 ID 中DriveApi获取 a DriveId

我尝试使用该DriveId方法decodeFromString,但是当我运行以下代码时,我收到一条错误消息,指出 DriveId 无效:

String googleDriveFolderId = "16TwNeDF9_inOK4X5AaGnVMNycNVxxMtd";
DriveFolder projectFolder = DriveId.decodeFromString(googleDriveFolderId).asDriveFolder();

我究竟做错了什么?

标签: androidgoogle-drive-android-api

解决方案


我想要做的事情根本不可能使用 Google Drive Android API。我想这是因为在上传之前DriveResource没有得到 a 。resourceId

请参阅此SO 答案,其中讨论了您如何无法访问不是由您的应用创建的任何文件或文件夹。我对此进行了测试,这是真的 - 当我Query为我在根文件夹中手动创建的文件夹运行时,我找不到它,但是当我从我的应用程序中创建一个同名的文件夹时,我得到 1 个查询结果。

另请参阅此SO 线程,它说您需要使用另一个 Google Drive API(他们建议使用 REST API)才能以编程方式指定文件夹(不使用用户选择文件夹的弹出窗口)。不幸的是,这对我不起作用,因为我正在构建一个离线应用程序——这正是我选择使用 Google Drive 的原因。

我最终做出妥协并使用根文件夹 - 幸运的是,我的项目将与非常特定的 Google 帐户一起使用,所以我能够做到这一点。我的代码看起来像这样

private void createFile() {
    // [START create_file]
    final Task<DriveFolder> rootFolderTask = getDriveResourceClient().getRootFolder();
    final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
    Tasks.whenAll(rootFolderTask, createContentsTask)
            .continueWithTask(task -> {
                DriveFolder parent = rootFolderTask.getResult();
                DriveContents contents = createContentsTask.getResult();
                OutputStream outputStream = contents.getOutputStream();
                try (Writer writer = new OutputStreamWriter(outputStream)) {
                    writer.write("Hello World!");
                }

                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                                                      .setTitle("HelloWorld.txt")
                                                      .setMimeType("text/plain")
                                                      .setStarred(true)
                                                      .build();

                return getDriveResourceClient().createFile(parent, changeSet, contents);
            })
            .addOnSuccessListener(this,
                    driveFile -> {
                        showMessage(getString(R.string.file_created,
                                driveFile.getDriveId().encodeToString()));
                        finish();
                    })
            .addOnFailureListener(this, e -> {
                Log.e(TAG, "Unable to create file", e);
                showMessage(getString(R.string.file_create_error));
                finish();
            });
    // [END create_file]
}

如果您不能妥协并使用根文件夹,我建议您从应用程序中创建一个文件夹到根文件夹中,然后保存 DriveId 的字符串表示形式,您可以在下次运行代码时使用它。我尚未测试该文件夹是否可以被在不同设备上运行的应用程序的另一个实例使用,但我希望如此(手指交叉)。

另一个选项是显示一个弹出窗口,以便用户可以手动选择文件夹。请参阅此演示示例


推荐阅读