Как использовать DriveApi.OnSyncFinishCallback (сервисы Google Play для Android)

В документации разработчика Android указано, что вы можете использовать DriveApi.OnSyncFinishCallback для (предположительно) обработки, когда синхронизация между вашим локальным контентом и вашей учетной записью Google Drive завершена. Обычно такая синхронизация происходит автоматически, прозрачно управляемая сервисами Google Play, но, по-видимому, вы можете форсировать запрос на синхронизацию с помощью вызова:

Drive.DriveApi.requestSync(mGoogleApiClient);

Я говорю «видимо», потому что официальная документация по этой функции очень скудная, по крайней мере (https://developer.android.com/reference/com/google/android/gms/drive/DriveApi.html#requestSync%28com.google.android.gms.common.api.GoogleApiClient%29)

В любом случае, OnSyncFinishCallback может быть создан с помощью этого кода:

OnSyncFinishCallback myCallback = new OnSyncFinishCallback(){

    @Override
    public void onSyncFinish(com.google.android.gms.common.api.Status arg0) {
        // TODO Auto-generated method stub

    }

};

Мой вопрос: где и как я могу зарегистрировать этот обратный вызов, чтобы он вызывался автоматически после завершения синхронизации? Вызов requestSync возвращает PendingResult, который имеет только метод setResultCallback(ResultCallback arg0), который нельзя использовать для OnSyncFinishCallback.


person Alessandro Prete    schedule 29.05.2014    source источник


Ответы (3)


Я должен сказать, что requestSync у меня работает абсолютно нормально (январь 2015 года, с Google Play Services 6.5.87). Я делаю резервную копию своей базы данных на одном устройстве и восстанавливаю ее на другом устройстве, но перед восстановлением я вызываю requestSync следующим образом:

    Drive.DriveApi.requestSync(mGoogleApiClient)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status result) {
                    if (!result.isSuccess()) {
                        // Sync not ok
                        showMessage("Sync error");
                        return;
                    }
                    // Sync ok. I can safely do a query to get
                    // the database file and restore it.
                    ...

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

person jmart    schedule 06.01.2015
comment
В моем проекте мне нужно знать, когда приложение закончило загрузку большого файла, может быть, requestSync работает только для загрузки (официальная документация ничего не говорит)? В любом случае, теперь правильный способ получить уведомление о завершении операции — через новые события завершения, добавленные в Google Play Services Drive API 6.1. - person Alessandro Prete; 16.01.2015

OnSyncFinishCallback — отвлекающий маневр, его не следует выставлять напоказ.

Просто добавьте обработчик обратного вызова в requestSync, как и любой другой метод GoogleApiClient:

Drive.Drive.requestSync(mGoogleApiClient).setResultCallback(
  new ResultCallback<Success>() {
     //...
  });
person Cheryl Simon    schedule 29.05.2014
comment
К сожалению, ResultCallback для requestSync вызывается почти сразу, а не после успешного завершения операции синхронизации. Вместо этого кажется, что onSyncFinish должен вызываться, когда синхронизация фактически завершена, это то, что мне нужно. - person Alessandro Prete; 30.05.2014
comment
Прочитать ответ Алессандро Прете - person Ilya Gazman; 30.03.2015

Оказалось, что OnSyncFinishCallback был удален из API, а DriveAPI.requestSync() не делает того, что должен. К счастью, Google только что представил новый Drive API для Android в версии 6.1 сервисов Google Play, в частности события завершения, которые делают именно то, что должен был делать OnSyncFinishCallback. Более подробная информация здесь https://developers.google.com/drive/android/completion.

person Alessandro Prete    schedule 09.10.2014
comment
Но вы не можете прикрепить/передать объект ExecutionOptions методу requestSync, поэтому Completion Events не предлагает никакой помощи w.r.t. синхронизации. Я наблюдаю одно и то же приложение (один и тот же APP_ID) на 2 разных устройствах, не могу найти общую папку... так что кажется, что по состоянию на август 2015 года невозможно обмениваться файлами между устройствами (даже когда приложения используют один и тот же APP_ID ). - person straya; 31.08.2015