Как получить 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 на вашем компьютере, а затем нажать на кнопку "ссылка" в верхней части.

ссылка на Google 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:

  1. имя файла / папки, как показано в приведенном выше коде, или
  2. строковый идентификатор, который вы получили от 'encodeToString()'. Например, я использую его для кэширования идентификатора папки MYROOT или
  3. строковый идентификатор, который вы получили от 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/ в этом учебнике, который они вызывают асинхронно

Другие вопросы по тегам