我的 Google Drive 帐户上有文件夹,我想在特定文件夹中添加文件。我该怎么做?在示例中需要 DriveId (EXISTING_FOLDER_ID),但我不知道 DriveID 我的文件夹,我只知道名称。
4 回答
好的。我在 Github 上的 Drive 演示中遇到了同样的问题:https ://github.com/googledrive/android-demos
在自述文件的底部,它说:
如果你真的想运行这个示例应用程序(虽然它主要是为了你可以阅读代码而提供的),你需要为包 com.google.android.gms.drive.sample.demo 注册一个 OAuth 2.0 客户端。拥有调试密钥并将任何资源 ID 设置为您有权访问的资源 ID。资源 ID 定义在:
com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FOLDER_ID com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FILE_ID
他们并没有真正指定应该如何获取和设置 BaseDemoActivity 文件中定义的 EXISTING_FOLDER_ID 和 EXISTING_FILE_ID 常量的资源ID,在阅读了上面的 seanpj 评论后,我使用他的方法 3 来查找 DriveID,以便我可以将其添加到演示应用程序,使其正常运行。
只需在您的 PC 上转到 Drive,然后单击顶部的“链接”按钮。
链接的一部分显示“id=XXXXXXXXXXX”。将其复制并粘贴到演示应用程序的 BaseDemoActivity 文件中。对您在云端硬盘上自己创建的文件和文件夹执行此操作。
演示应用程序现在应该成功运行。
@smokybob。我不知道它是否有助于解决原始问题,但根据您的评论:
这是一个代码片段,应该可以让您获得文件夹/文件 DriveId。'title'、'mime' 和 'fldr' 参数是可选的。如果您为“fldr”传递null,则搜索是全局的(在应用程序的 FILE 范围内),否则在指定的文件夹中(但不在子文件夹中)。它使用最简单的 - 'await()' 风格,必须从 UI 线程中运行。
但请注意,文件夹/文件名在 Google Drive Universe 中并不是唯一的实体。您可以在一个文件夹中拥有多个同名的文件/文件夹!
GoogleApiClent _gac; // initialized elsewhere
//find files, folders. ANY 'null' ARGUMENT VALUE MEANS 'any'
public void findAll(String title, String mime, DriveFolder fldr) {
ArrayList<Filter> fltrs = new ArrayList<Filter>();
fltrs.add(Filters.eq(SearchableField.TRASHED, false));
if (title != null) fltrs.add(Filters.eq(SearchableField.TITLE, title));
if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();
MetadataBufferResult rslt = (fldr == null) ?
Drive.DriveApi.query(_gac, qry).await() :
fldr.queryChildren(_gac, qry).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb != null) {
for (Metadata md : mdb) {
if (md == null) continue;
DriveId dId = md.getDriveId(); // here is the "Drive ID"
String title = md.getTitle();
String mime = md.getMimeType();
// ...
}
}
} finally { if (mdb != null) mdb.close(); }
}
}
一般来说,您可以从以下位置获取所需的“DriveId”:
- 如上面代码所示的文件/文件夹名称,或
- 您从“encodeToString()”获得的字符串标识符。例如,我用它来缓存 MYROOT 文件夹 ID,或者
- 您从“getResourceId()”获得的字符串标识符。这是您在 html 地址中看到的字符串。但由于您唯一的作用域是 FILE,因此不要指望使用它来打开您的应用未创建的内容。
2 和 3 标识符都是字符串,所以它们可能会混淆。检索驱动器 ID(通过 decodeFromString())时,标识符 2 更快。标识符 3 的检索速度较慢(通过 fetchDriveId()),但如果您需要将您的 ID 带到其他地方(例如,Apps 脚本),它会很有用。另见SO 21800257
就文件/文件夹的创建而言,我在GitHub 上有一些代码。如果您查看 awaits\MainActivity.java ... buildTree(),您将看到在构建简单文件夹树时递归地创建文件夹/文件。
您可以使用查询来查找文件夹
Query query = new Query.Builder().addFilter(Filters.and(
Filters.eq(SearchableField.TITLE, "folder name"),
Filters.eq(SearchableField.TRASHED, false))).build();
我在本教程中找到了一个示例教程 http://wiki.workassis.com/android-google-drive-api-deleted-folder-still-exists-in-query/ 他们正在异步调用
如果您有文件夹的元数据(或 DriveFolder 对象,您可以从中获取元数据),则只需调用getDriveId。
如果您有网络资源,则可以使用 fetchDriveId 使用该资源 id获取 DriveId