2014-01-26 2 views
6

UPDATE (май 2015):
Функциональность «мусор» была реализована в GDAA, что делает вопрос ниже несущественным.Корзина, удалить в новом API Google Диске Android?

ORIGINAL ВОПРОС:
Как я играю с новым «Google Drive Android API» (GDAA), я бег в нескольких неточностей я не могу понять. В основном, у меня есть старое приложение, которое использует интерфейс com.google.api.services.drive (вставка, исправление, обновление), и я ЛЮБЛЮ, чтобы поместить его в GDAA.

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

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

С новым GDAA оно не работает. Который подводит меня ко второму пункту:

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

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

+0

В чем вопрос? – DaImTo

+0

Чисто из любопытства, почему вы хотите перейти от REST API к локальному API ?. Я взглянул на новый API и решил придерживаться того, что (в основном) работает. Существует небольшое несоответствие парадигмы между дисковым и Android-хранилищем Android, поэтому вы находитесь на милость, однако Google в конечном итоге соответствует двум. В частности, я думаю обо всех богатых метаданных, доступных на Диске, которые могут или не могут быть реализованы в Android. – pinoyyid

+5

Вопрос: «ГДЕ УДАЛИТЬ (или Корзина или setTrash()) В НОВОМ API GOOGLE DRIVE?». И ответ на ваш вопрос любопытства здесь: https://www.youtube.com/watch?v=quQyZdhPjxc и здесь: https://developers.google.com/drive/android/files My Android приложение должно писать/читать файлы на Google Диск, и новый API должен заботиться обо всех функциях синхронизации. Отсутствие функциональности (индексирование, описание, полный текст) на данный момент я могу предоставить себе в своем приложении, и я надеюсь, что они наверстают упущенное. Кроме того, мне нравится играть с новыми игрушками. – seanpj

ответ

4

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

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

+5

Любой таймфрейм шара по возможности удаления? – Nick

+0

Есть ли способ принудительно обновить/пересинхронизировать? – m02ph3u5

0

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

+0

приурочил меня, попробовав еще раз: Здесь вы можете попытаться извлечь код из «AsyncTask» «doInBackground». https://github.com/seanpjanson/140201-GDAA/blob/master/awaits/MainActivity.java Он может работать как услуга. По крайней мере, я планирую использовать что-то подобное. В файле readme.txt в корне есть немного рассказа. – seanpj

+0

Спасибо, я посмотрю. Но я понял, что удаление еще не реализовано. Я имею в виду преобразование в новый api на текущий момент – nLL

+1

Да, а также (за выпуск https://github.com/googledrive/android-demos/issues/3), удаление файлов на диске и ожидающих увидеть его на Android. довольно ненадежный (вот почему я на самом деле написал это 140201-GDAA). Но это хорошее начало, и они, вероятно, исправят/поддержат его в ближайшее время. – seanpj

1

Хотя Google Android 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); 
     } 
    } 
    }); 
} 
+2

Я могу игнорировать его, но мои пользователи будут баллистически видеть ведра «удаленных» файлов, сидящих на своем диске, занимая цитату. Суть вопроса заключалась в том, чтобы совать Гуглеров. – seanpj

+0

Да, это полезно, если вы используете AppFolder. –

+0

Апи изменилась (снова) немного. Я переписываю ваш код @Mark Carter (см. Код на мой ответ ниже). – Renascienza

5

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

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

+3

Мое лучшее достижение - создать файл в папке через 3 часа после того, как папка была повреждена с помощью интерфейса веб-диска. Я мог бы с радостью писать контент, метаданные в файл в никогда-никогда-земле без признаков ошибки. И все это, даже если мусор был опустошен вручную несколько часов назад. Чудеса случаются ... – seanpj

+3

да, то же самое со мной. Если вы не можете заставить этот новый API очистить кеш и получить свежие результаты, это бесполезно для синхронизации на мой взгляд. – qkx

+1

Да, через год и до сих пор нет функции удаления, а сеть все еще усеяна кодом/примерами/документацию из не-GPS-версии Android Drive API, включая хороший пример из @Burcu, который еще не обновлен. Недостатком Google является то, что постоянное развитие означает, что все является движущей целью, а документация постоянно устарела. Мне удалось преобразовать код appdatapreferences от Burcu в новый API, но я все еще изо всех сил стараюсь полностью работать. Здесь мы надеемся, что новый год принесет новую документацию и примеры. – Alchete

1

Если вы работаете с App Folder (невидимый для пользователя), вы цель, чтобы удалить файл является только для экономии пространства пользователя и никогда не выбирайте его снова. Таким образом, вы можете использовать стратегию «пустой и забыть».

От @Mark Картер (поскольку 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); 
      } 
     } 

    }); 
} 
+0

throws IllegalStateException в 'OutputStream out = contents.getOuputStream();' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Драйвер говорит, что ' ' – m02ph3u5

+0

Извините, когда я отправлю код, он еще не был протестирован.Я исправил его позже в своем проекте, но забыл обновить его здесь. Я опубликую обновление как можно скорее. – Renascienza

1

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

Еще не проверено - я скоро отправлю отчет.

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

0

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

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

Смежные вопросы