Android Google Play / Drive Api

Привет! Я использую Google Drive Api для хранения базы данных с помощью функции AppDataFolder. У меня есть тестовое приложение, успешно запущенное на одном устройстве. Я могу загрузить / обновить / удалить / загрузить файл базы данных и без проблем интегрировать его в программу.

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

Я пробовал разные вещи, например, пытался перечислить все файлы AppDataFolder или извлекать метаданные через запрос с фильтрами с возможностью поиска до того, как сделать запрос на обновление / удаление и т. Д. Однако я не могу заставить его работать так, как хотелось бы, он выбирает, когда синхронизировать.

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

заранее спасибо

EDIT/UPDATE:

Мне удалось найти параметр в API для синхронизации содержимого диска с помощью этого кода:

            // try to sync
            Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() {
                @Override
                public void onResult(com.google.android.gms.common.api.Status status) {
                    if (!status.getStatus().isSuccess()) {
                        Log.e("SYNCING", "ERROR" + status.getStatusMessage());
                    } else {
                        Log.e("SYNCING", "SUCCESS");
                        // execute async task to list AppFolderContents
                        new AppFolderContentsAsyncTask(getActivity()).execute();
                    }
                }
            });

Это хорошо работает для 3/4 попыток в быстрой последовательности, однако я достигаю предела синхронизации и сообщения о состоянии:

ERRORSync превышен лимит скорости запроса.

Есть ли способ увеличить частоту запросов, так как это не очень желательно, если мне нужно приложение, которое запрашивает пользователя: "Пожалуйста, попробуйте позже синхронизироваться - не знаю, сколько времени вам придется ждать, пока вы сможете!"

РЕШЕНИЕ - СОРТЫ И МОИ МЫСЛИ (для чего это стоит)

Решение, которое я собираюсь найти (после отправки по электронной почте разработчику приложения, опубликовавшего приложение для дисковода, которое синхронизируется без проблем), заключается в использовании Drive REST Api, а не в более новом (и предпочтительном для Google) Drive API. Я пытался ограничить 'requestSync' только когда пользователь перешел к фрагменту с параметрами диска (а не к каждой файловой транзакции). Однако это, вероятно, решило бы ограничение скорости requestSync по большей части, но оно все равно могло бы достичь этого предела. Кроме того, если приложение запускается несколькими устройствами и связано с одной и той же учетной записью Drive, они одновременно синхронизируют / загружают / удаляют файлы в приложении, тогда существует вероятность потери синхронизации - возможно, это редкий сценарий, но все же возможный. Я не считаю, что заставлять пользователя ждать синхронизации файлов - жизнеспособный вариант с точки зрения пользовательского опыта или дизайна приложения.

Любопытно, хотя - само приложение Drive позволяет обновлять (requestSync?) Столько раз, сколько вам нужно. Я быстро создал 20 папок в веб-интерфейсе, после создания каждой папки я обновлял приложение Drive на своем телефоне, и оно синхронизировалось все 20 раз. Кажется, Google понимает важность синхронизации, но решает сделать это довольно сложно, чтобы обеспечить это в своем новом Drive API. Как уже говорилось, загрузка файлов в облачное хранилище обычно происходит мгновенно (это ставится в очередь, однако при наличии подключения это происходит практически сразу). Я бы подумал, что это дорогостоящая транзакция с точки зрения перемещения данных / обновления содержимого диска, а не просто запроса синхронизации файлов. Однако вы можете продолжать добавлять файлы в свое дисковое приложение по одному, и оно загружает их по одному почти мгновенно - при запросе синхронизации более 4 раз за 30 секунд, а затем происходит сбой, и вам приходится "остывать". ' какое-то время.

Я очень новичок в программировании /Android в целом - как только я узнаю что-то новое, я понимаю, как мало я на самом деле знаю, поэтому, если это лучшее решение с использованием Drive API (а не REST API), я бы очень приветствую это.

1 ответ

Решение

DriveApi#requestSync позволит вам запросить "синхронизацию" с сервера на устройство. Таким образом, на втором устройстве вы сможете увидеть контент, загруженный с первого устройства. Тем не менее, запросы на синхронизацию запросов ограничены (для каждого устройства), чтобы избежать злоупотреблений и гарантировать разумное количество данных, используемых Drive API. В идеале вы должны вызывать запрос синхронизации только тогда, когда вам нужно. Там нет никакого способа увеличить ограничение скорости.

Что касается завершения загрузки, после принятия загрузки вы не должны использовать синхронизацию запросов, так как это не поможет вам (она только синхронизируется, но не работает). Фактическая загрузка произойдет как можно скорее (в зависимости от подключения устройства и настроек, указанных вашим приложением через DrivePreferencesApi, которые по умолчанию не имеют ограничений).

Если вы хотите знать, когда произошла фактическая загрузка, вы можете использовать CompletionEvents. Таким образом, вы можете протестировать свое приложение с большим пониманием того, что на самом деле происходит.

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