Корзина, Удалить в новом Google Drive Android API?

ОБНОВЛЕНИЕ (май 2015):
функциональность "мусор" была реализована в GDAA, что делает вопрос ниже неактуальным.

ОРИГИНАЛЬНЫЙ ВОПРОС:
Играя с новым "Google Drive Android API" (GDAA), я столкнулся с несколькими несоответствиями, которые я не могу выяснить. По сути, у меня есть старое приложение, которое использует интерфейс "com.google.api.services.drive" (вставка, исправление, обновление), и мне очень хотелось бы перенести его в GDAA.

Во-первых, GDAA против веб-приложения drive.google.com.
В старом сервисе я использовал область действия DriveScopes.DRIVE_FILE, поэтому я предполагал аналогичное поведение / результаты. Файлы, созданные со старым файлом "DriveScopes.DRIVE_FILE", я (владелец накопителя) могу удалить на странице " https://drive.google.com/ " (я предполагаю, что моя область действия - DRIVE), и последующие запросы приложений Android не найдутся их. Он ведет себя так, как я ожидал:

  1. Приложение Android создает файлы.
  2. Пользователь удаляет их на "drive.google.com".
  3. Android-приложение их больше не видит.

С новым GDAA, похоже, не работает. Что подводит меня ко второму пункту:

УДАЛИТЬ / УДАЛИТЬ функциональность.
Я пытался протестировать функциональность CRUD и вообще не мог найти DELETE (опять же, это может быть мое невежество / близорукость). Удаление их с "drive.google.com" делает их там невидимыми, но приложение для Android все равно их видит. Метаданные можно запрашивать через "isTrashed()", но в "MetadataChangeSet.Builder" нет ничего, что позволило бы мне удалить / удалить их, только setMimeType(), setStarred(), setTitle().

Я потерян, пожалуйста, помогите.

7 ответов

Решение

Google Drive Android API не синхронизируется с удаленными ресурсами мгновенно. В зависимости от планировщика синхронизация может занять некоторое время. Планирование зависит от компонентов синхронизации учетных записей Android, которые обеспечивают сохранение и эффективное использование полосы пропускания сети и времени автономной работы.

Кроме того, начиная с предварительного просмотра, мы не поддерживаем удаление или удаление. Но следующий релиз, скорее всего, будет поддерживать эти действия.

Если вы хотите получить полный контроль над синхронизацией, не используйте Google Drive Android NEW API (по крайней мере, на данный момент). Он еще недостаточно хорош (октябрь 2014 г.) или, соответственно, работает иначе, чем OLD API в реальном времени. Основные проблемы заключаются в том, что вы не можете удалить файл, изменения происходят не в реальном времени, метаданные часто кэшируются (когда я выполняю поисковый запрос, в результатах я вижу удаленные файлы даже через много часов!). Вероятно, из-за некоторых оптимизаций службы дисков запускаются, когда они хотят и как они хотят, поэтому почти ничего не находится под вашим контролем - вы никогда не знаете, как служба дисков использует кэш, и вы не можете заставить службу дисков "выполнять работу прямо сейчас, потому что я нужно это".

О, и еще один недостаток в том, что код намного сложнее, чем та же логика, созданная в OLD API:)

В новой версии Сервисов Google Play (7.0.0 / март 2015) наконец-то появилась DriveRessource.trash(), См. https://developer.android.com/reference/com/google/android/gms/drive/DriveResource.html

Еще не проверял - скоро сообщу.

// edit Хорошо, я проверил это, и оно работает... но не для файлов в папке приложения: Cannot trash App Folder or files inside the App Folder. По-видимому, вы не можете использовать эту функцию во время использования папки приложения.

Хотя Google Drive Android API еще не поддерживает удаление, вы можете удалить его содержимое (и, в то же время, переименовать заголовок, чтобы в будущем его можно было игнорировать). Это может быть полезно разработчикам, использующим AppFolder.

private void deleteContents(final DriveFile driveFile) {
  driveFile.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
    @Override
    public void onResult(DriveContentsResult result) {
      if (!result.getStatus().isSuccess()) {
        // oh noes!
        return;
      }
      DriveContents contents = result.getDriveContents();
      try {
        MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setTitle(DELETED_DRIVE_TITLE).build();
        contents.commit(mGoogleApiClient, metadataChangeSet).setResultCallback(
                new ResultCallback<Status>() {
                  @Override
                  public void onResult(Status status) {
                    if (!status.isSuccess()) {
                      // more oh noes!
                      return;
                    }
                    // nicely deleted
                  }
                });
      }
      catch (Exception e) {
        contents.discard(mGoogleApiClient);
      }
    }
  });
}

Если вы работаете с папкой приложений (невидимой для пользователя), ваша цель - удалить файл только для того, чтобы сохранить пространство пользователя и никогда больше не выбирать его. Таким образом, вы можете использовать стратегию "пусто и забыть".

От @Mark Carter (потому что API-интерфейс Android Drive изменился):

    private void deleteContents(final DriveFile driveFile) {
    driveFile.open(this.client, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
        @Override
        public void onResult(DriveApi.DriveContentsResult result) {
            if (!result.getStatus().isSuccess()) {
                // oh noes!
                return;
            }

            final DriveContents contents = result.getDriveContents();                

            try {
                MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setTitle("deleted").build();
                contents.commit(PhotoAdapter.this.client, metadataChangeSet).setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) {
                        if (!status.isSuccess()) {
                            // more oh noes!
                            return;
                        }
                        // nicely marked, now destroy data
                        OutputStream out = contents.getOutputStream();
                        try {
                            out.write(0x0);
                            //nicely empty
                        } catch (IOException e) {
                            //oh, no...
                            throw new RuntimeException(e);
                        }finally {
                            try {
                                out.close();
                            } catch (IOException e) {
                                //what we can do? Just log it
                            }
                        }
                    }
                });
            }
            catch (Exception e) {
                //Unsuccessful. Log it, rollback  contents and cry
                contents.discard(PhotoAdapter.this.client);
            }
        }

    });
}

@Burcu Dogan, не уверен, что вы увидите это, но согласно https://github.com/googledrive/android-demos/issues/4 будет ли пример для запуска операций GDrive из службы?

Начиная с сервисов Google Play 7.5 поддерживаются как удаление, так и мусор: https://developers.google.com/drive/release-notes

Мы рекомендуем использовать корзину для файлов, видимых пользователям, а не удалять, чтобы дать пользователям возможность восстановить любой случайно удаленный контент. Удаление является постоянным и рекомендуется только для содержимого папки приложения, где корзина недоступна.

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