Как получить DriveId созданной папки в Google Drive Android API
У меня есть папки в моей учетной записи Google Drive, и я хочу добавить файлы в определенную папку. Как мне это сделать? В примере нужен DriveId (EXISTING_FOLDER_ID), но я не знаю DriveID моей папки, я знаю только имя.
4 ответа
Если у вас есть метаданные для папки (или объект DriveFolder, из которого вы можете получить метаданные), вы можете просто вызвать getDriveId.
Если у вас есть веб-ресурс, вы можете получить DriveId, используя этот идентификатор ресурса, используя fetchDriveId
ХОРОШО. У меня возникла та же проблема с демонстрацией Drive на Github: https://github.com/googledrive/android-demos
В нижней части readme написано:
Если вы действительно хотите запустить этот пример приложения (хотя оно в основном предоставляется, чтобы вы могли прочитать код), вам необходимо зарегистрировать клиент OAuth 2.0 для пакета com.google.android.gms.drive.sample.demo с вашим собственные ключи отладки и установите любые идентификаторы ресурсов для тех, к которым у вас есть доступ. Определения идентификатора ресурса находятся на:
com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FOLDER_ID com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FILE_ID
Они на самом деле не указали, как именно нужно получать и устанавливать resourceID для констант EXISTING_FOLDER_ID и EXISTING_FILE_ID, определенных в файле BaseDemoActivity, и после прочтения комментария seanpj выше, я использовал его метод № 3, чтобы найти DriveID, чтобы я мог добавить его в демо-приложение, чтобы оно работало правильно.
Все, что нужно сделать, это зайти в Drive на вашем компьютере, а затем нажать на кнопку "ссылка" в верхней части.
Часть ссылки говорит: "id = XXXXXXXXXXX". Скопируйте его и вставьте в файл BaseDemoActivity в демонстрационном приложении. Сделайте это как для файла, так и для папки, которую вы создаете сами на диске.
Демо-приложение должно теперь успешно работать.
@smokybob. Я не знаю, поможет ли это с оригинальным вопросом, но согласно вашему комментарию:
Вот фрагмент кода, который должен получить вашу папку / файл DriveId. Аргументы 'title', 'mime' и 'fldr' являются необязательными. Если вы передадите null для 'fldr', поиск будет глобальным (в пределах области приложения FILE), в противном случае в указанной папке (но не во вложенных папках). Он использует простейший вариант - await(), который должен быть запущен из потока пользовательского интерфейса.
Однако будьте осторожны, имена папок / файлов не являются уникальными объектами в 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 или
- строковый идентификатор, который вы получили от getResourceId(). Это строка, которую вы видите в html-адресе. Но поскольку ваша единственная область действия - ФАЙЛ, не рассчитывайте использовать ее для открытия того, что ваше приложение не создало.
И 2, и 3 идентификаторы являются строками, поэтому они могут быть перепутаны. Идентификатор 2 быстрее при получении идентификатора диска (с помощью decodeFromString()). Идентификатор 3 медленнее извлекается (через fetchDriveId()), но полезен, если вам нужно взять свой идентификатор в другом месте (например, Apps Script). Смотри также 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/ в этом учебнике, который они вызывают асинхронно