如何创建文件选取器以使用REST API将文件保存到Google Drive



现在Google正在弃用Google Drive Android API,我正在将代码迁移到Drive REST API。

我几乎所有的东西都在工作,但我无法复制创建文件选取器的功能,该功能允许用户选择要将文件保存在Google Drive中的文件夹。我能够成功地将文件复制到用户的Google Drive根文件夹中,但我更喜欢创建一个选择器,让用户能够将其放置在他们想要的位置。

我创建了一个文件选择器,用于使用谷歌提供的示例应用程序从谷歌硬盘中选择要下载的文件,但不幸的是,他们没有提供文件夹选择的示例。此外,我能够找到为网络应用程序创建文件选择器的文档,但不适用于Android应用程序。

我知道我可以选择要将文件插入其中的文件夹的名称,但我如何创建一个选择器以允许用户使用REST API选择文件夹(并命名文件(?这个应该很简单,我希望避免使用第三方库。

谢谢!

这个问题有点老,所以您可能已经想明白了。但我只是遇到了同样的问题,所以也许其他人也感兴趣。

这里的问题是Google Drive REST API使用ID来识别文件和文件夹。API不提供文件或目录拾取器,这就是您使用Android内置拾取器的原因。例如,为了允许用户为新文件选择名称和目标文件夹,您可以使用以下意图:

Intent createDirectoryPickerIntent(String fileName, String mimeType) {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(mimeType);
intent.putExtra(Intent.EXTRA_TITLE, fileName);
return intent;
}

并在您的活动中创建它:

public void openDirectoryPicker() {
if (mDriveServiceHelper != null) {
Intent pickerIntent = mDriveServiceHelper.createDirectoryPickerIntent("fileName", "text/plain");
startActivityForResult(pickerIntent, REQUEST_CODE_OPEN_DIR);
}
}

(记住删除空文件,以防在第二步中写入实际内容失败。(

文件拾取器通过URI识别文件,对文件ID一无所知。按名称查询文件以获取新文件的id可能会失败,因为在另一个甚至同一个文件夹中可能存在重复。这就是为什么谷歌建议使用其他方式访问文件:

对于使用Android API文件选择器的客户端(例如,通过调用DriveClient#newOpenFileActivityIntentSender(,我们建议使用存储访问框架(SAF(,用于访问Drive Android应用程序的内容提供商。示例应用程序演示如何启动文件picker Intent并处理它返回的数据。(Google Drive Android API弃用指南(

正如您所说,示例应用程序提供了一个在openFileUsingStorageAccessFramework(...)中读取文件的示例。您可以对使用上述目录选择器创建的文件执行相同的操作。URI由意图提供。

在您的活动中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
switch (requestCode) {
case REQUEST_CODE_SIGN_IN:
//...
}
break;
case REQUEST_CODE_OPEN_DIR:
if (resultCode == RESULT_OK && resultData != null) {
Uri uri = resultData.getData();
if (uri != null && mDriveServiceHelper != null) {
mDriveServiceHelper.writeToFileUsingStorageAccessFramework(this, getContentResolver(), uri, "some content")
.addOnSuccessListener(Void -> {
Log.v(TAG, "success");
})
.addOnFailureListener(exception -> {
Log.e(TAG, "Unable to write to file.", exception);
});
}
} else {
Log.v(TAG, "Unable to write to file.");
}
break;
}
super.onActivityResult(requestCode, resultCode, resultData);
}

并且在DriveServiceHelper中与示例应用程序非常相似:

Task<Void> writeToFileUsingStorageAccessFramework(Context context, ContentResolver contentResolver, Uri uri, String content) {
return Tasks.call(mExecutor, () -> {
// Retrieve the document's display name from its metadata.
String name;
try (Cursor cursor = contentResolver.query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
name = cursor.getString(nameIndex);
} else {
throw new IOException("Empty cursor returned for file.");
}
}
// Write content to the file, e.g.
try (OutputStream outputStream = contentResolver.openOutputStream(uri);) {
if (outputStream != null) {
outputStream.write(content.getBytes());
outputStream.close();
}
}
return null;
});
}

最新更新