android - 如何使用 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();
我究竟做错了什么?
解决方案
我想要做的事情根本不可能使用 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 的字符串表示形式,您可以在下次运行代码时使用它。我尚未测试该文件夹是否可以被在不同设备上运行的应用程序的另一个实例使用,但我希望如此(手指交叉)。
另一个选项是显示一个弹出窗口,以便用户可以手动选择文件夹。请参阅此演示示例。
推荐阅读
- android - 我可以为我的应用启用双通道加速吗?
- git - 合并请求和同步分叉回购
- laravel - 如何使用纬度或经度使 Laravel 像 Facebook 一样登录安全?
- c# - 使用 Mapster 将一个类属性映射到两个不同的类属性
- amazon-web-services - Boto3 Upload file API 作为 IAM 用户给出错误“调用 PutObject 操作时发生错误 (AccessDenied):访问被拒绝”
- python - 如何在 sphinx 中为生成的代码块设置标题
- node.js - 在 aws elasticbeanstalk 中,如果没有 https/http,url 不起作用
- c# - 使用 ADO.NET 如何将数据列表插入 SQL?
- flutter - Flutter Provider:未处理的异常:查找已停用小部件的祖先是不安全的
- android - MIUI - 尝试启动 ACTION_SEND / ACTION_VIEW 意图时权限被拒绝