如何使用Google Drive Android API实例化DriveId / DriveFolder

时间:2018-06-19 18:56:07

标签: android google-drive-android-api

我确信这是一个容易回答的问题,但我一直无法找到如何使用Google Drive Android实例化具有驱动器资源ID的DriveId和/或DriveFolder的方法API第12版。

我已阅读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();

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

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()

答案 1 :(得分:0)

使用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云端硬盘的原因。

我最终做出了让步,并使用了根文件夹-对我而言,幸运的是我的项目将用于非常特定的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