【问题标题】:How do you instantiate a DriveId/DriveFolder using the Google Drive Android API如何使用 Google Drive Android API 实例化 DriveId/DriveFolder
【发布时间】:2018-06-19 18:56:06
【问题描述】:

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

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

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

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

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

我做错了什么?

【问题讨论】:

    标签: android google-drive-android-api


    【解决方案1】:

    Create a folder

    要创建一个文件夹,调用DriveResourceClient.createFolder(),传递 在对父文件夹和元数据对象的引用中 标题和其他属性来设置文件夹的值。

    以下代码示例演示了如何在 根目录:

    private void createFolder() {
        getDriveResourceClient()
                .getRootFolder()
                .continueWithTask(task -> {
                    DriveFolder parentFolder = task.getResult();
                    MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                                                          .setTitle("New folder")
                                                          .setMimeType(DriveFolder.MIME_TYPE)
                                                          .setStarred(true)
                                                          .build();
                    return getDriveResourceClient().createFolder(parentFolder, changeSet);
                })
                .addOnSuccessListener(this,
                        driveFolder -> {
                            showMessage(getString(R.string.file_created,
                                    driveFolder.getDriveId().encodeToString()));
                            finish();
                        })
                .addOnFailureListener(this, e -> {
                    Log.e(TAG, "Unable to create file", e);
                    showMessage(getString(R.string.file_create_error));
                    finish();
                });
    }
    

    如果成功,请尝试致电getDriveId()

    【讨论】:

    • 感谢您抽出宝贵时间回答,很遗憾,这并不能回答我的问题:如何创建 DriveFolder 和 DriveId?
    • 感谢您更新答案。不幸的是,它仍然对我没有帮助,因为我没有创建文件夹,我有一个已经存在的文件夹。请参阅我的问题中的代码。
    • 您是否要在文件夹中创建文件夹?顺便说一句,您不创建 DriveID,服务器会为您处理每个成功的 API 请求。
    • 我得到了一个由其他人创建并与我共享的文件夹,我正在该文件夹中创建一个文件
    • 这不是我之前发的Create file inside a folder吗?
    【解决方案2】:

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

    看到这个SO answer which discusses how you aren't able to access any file or folder that isn't created by your app。我对此进行了测试,这是真的 - 当我为我在根文件夹中手动创建的文件夹运行 Query 时,我找不到它,但是当我从我的应用程序中创建一个同名的文件夹时,我得到 1 个查询结果。

    另请参阅此SO thread which says you need to use another Google Drive API (they suggested the REST API),以便能够以编程方式指定文件夹(无需使用用户选择文件夹的弹出窗口)。不幸的是,这对我不起作用,因为我正在构建一个离线应用程序——这正是我选择使用 Google Drive 的原因。

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

    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 的字符串表示形式,您可以在下次运行时使用代码。我尚未测试该文件夹是否可以被在不同设备上运行的应用程序的另一个实例使用,但我希望如此(祈祷)。

    另一个选项是显示一个弹出窗口,以便用户可以手动选择文件夹。见this demo example

    【讨论】:

    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多