Intereting Posts
Когда дочерние представления добавляются в Layout / ViewGroup из XML Извлеките исходный сертификат X.509 из подписанного APK или JAR Читаемый человеком DhcpInfo.ipAddress? Android: вставка записи sqlite с колонкой AUTOINCREMENT Android (JSONObject) Как я могу пройти через плоский объект JSON, чтобы получить каждый ключ и каждое значение Не удается переопределить ресурс xml библиотеки с ресурсом png в приложении? Android: дизайн SQLite one-to-many MediaPlayer: не удалось открыть файл на стороне клиента; Ошибка (-38,0) и более Макет, как и карты в Android Ошибка Xamarin.IOS. Невозможно разрешить ссылку: C: / Program Files (x86) /../ Xamarin.iOS / v1.0 / Фасады / System.Private.CoreLib.InteropServices.dll Управление вводом HTML-файла с атрибутами захвата и принятия работает неправильно? Использование акселерометра, гироскопа и компаса для расчета движения устройства в 3D-мире Как использовать ActionBarActivity с Theme.Material Исключение из списка репликации Android RecyclerView LayoutManager Неопределенный круговой индикатор хода на андроиде белый, несмотря на цвет.

Интеграция с Google Диском с использованием текущей активности

Можно ли интегрироваться с Google Диском, не создавая собственную активность, вместо этого просто используя текущую активность для приложения, не загрязняя его кодом, связанным с Google Диском?

У меня есть фоновый «сервис» (а не служба Android, а именно класс UI-агностик), который отвечает за загрузку некоторых данных с Google Диска. Как услуга, у нее нет реального бизнеса, являющегося активностью. Тем не менее, образцы для интеграции с накопителем имеют переопределение onActivityResult для обработки ситуации, когда требуется аутентификация. Я не уверен, как получить эту информацию, если моя служба не будет реализована как деятельность.

Предполагая, что я могу получить ссылку на текущую Activity из моей «службы», можно ли каким-то образом реализовать интеграцию с Google Диском полностью автономным образом?

Solutions Collecting From Web of "Интеграция с Google Диском с использованием текущей активности"

Я сделал что-то подобное из приложения, которое имеет Activity и SyncService. Здесь вы можете увидеть множество функций в демо . Эта демонстрация не использует сервис , но идея остается прежней.

1 / Создайте одноэлементный класс (в этом случае GDAA ) с помощью метода init (), который принимает ваш контекст активности. Этот init() будет создавать локальный статический GoogleApiClient который останется в живых, пока вам не нужно переключать учетные записи (объясняется позже).
init() вызывается с контекстом активности в начале или при необходимости переключиться на другую учетную запись пользователя (другой GooDrive для другого пользователя). Активность проходит в его контексте и поставляет onConnFail(), onConnOK() обратные вызовы.
Для полноты должно быть также условие для onConnectionSuspended() в случае прерывания соединения (не соединение WIFI / CELL, но приостановление GooPlaySvcs).

  • onConnFail() вызов onConnFail() передает управление GooPlaySvcs для аутентификации / авторизации, результат которого возвращается в onActivityResult() . Подключите снова, промойте, промойте, повторите …
  • onConnOK() вызов onConnOK() сообщает вашей активности, что все готово.

Как я уже сказал, вам придется снова вызвать init() если вы обрабатываете несколько учетных записей GooDrive, чтобы создать новый GoogleApiClient для новой учетной записи. Просто следуйте по следу «REQ_ACCPICK». Вам также придется управлять своими учетными записями, как вы можете видеть в классе «AM» менеджера аккаунта. Большинство этих танцев можно увидеть в MainActivity .
Для полноты я должен также упомянуть, что вы можете оставить управление учетными записями в GooPlaySvcs, опустив setAccountName(email) в GoogleApiClient.Builder() и воспользуйтесь clearDefaultAccountAndReconnect() чтобы сбросить выбор аккаунта. Но ваше приложение не будет знать, кем является текущий пользователь. Еще одно управление учетными записями можно обрабатывать с помощью PlusApi (или того, что он называется, никогда не использовал). Но я отвлекся.

2 / Когда инициализация завершена, а закрытый статический GoogleApiClient mGAC равен нулю и подключен, статические методы GDAA можно ссылаться из любого места в вашем приложении, включая службу . Методы, безусловно, потерпят неудачу, если GoogleApiClient не жив или не подключен.

В приведенной здесь демоверсии все вызовы GDAA имеют «ожидание» (синхронный) вкус. Это не проблема, если они вызываются из потока, отличного от UI, как сервис. Их можно легко превратить в асинхронные версии, как в этом примере:

 DriveFile df = ...; // sync version DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await(); if ((rslt != null) && rslt.getStatus().isSuccess()) { DriveContents cont = rslt.getDriveContents(); InputStream is = cont.getInputStream(); cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY } // async version df.open(mGAC, DriveFile.MODE_READ_ONLY, null).setResultCallback( new ResultCallback<DriveContentsResult>() { @Override public void onResult(DriveContentsResult rslt) { if ((rslt != null) && rslt.getStatus().isSuccess()) { DriveContents cont = rslt.getDriveContents(); InputStream is = cont.getInputStream(); cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY } } }); 

Аромат зависит от потребностей вашего приложения (код спагетти с потребляемыми возвращаемыми значениями против асинхронной обработки).

Следует отметить, что в этой демонстрации используется версия GDAA Api. Существует также REST Api, который можно обрабатывать одинаково (только синхронный вкус). Здесь представлена ​​альтернативная демоверсия, которая использует точно такую ​​же логику и методы. Вы даже можете объединить два в один одноэлементный класс с обоими
com.google.api.services.drive.Drive и com.google.android.gms.common.api.GoogleApiClient .

Однако опасно смешивать GDAA и REST Api, поскольку вы наверняка столкнетесь с проблемами времени, вызванными тем фактом, что GDAA синхронизируется в своем собственном расписании, тогда как REST находится под вашим контролем.

Надеюсь, это помогло, Удачи

Код кода onActivityResult используется только в случае сбоя аутентификации, требующего вмешательства пользователя. Таким образом, по определению, он не может быть просто обработан «в фоновом режиме» службой.

В случае фоновой службы, я думаю, что один из подходящих способов справиться с ошибкой аутентификации – показать уведомление о том, что «вам нужно пройти аутентификацию для продолжения». Вы можете приложить намерение к уведомлению, чтобы он запускал вашу собственную «ResolveAuthActivity», когда пользователь нажимает на уведомление. Эта ResolveAuthActivity просто пытается подключиться к API, обрабатывает сбой в onConnectionFailed, а затем запускает решение Intent. После того, как отказ будет разрешен, ваш ResolveAuthActivity может выставить вашу службу, чтобы попытаться снова подключиться к API.

Я думаю, вы можете добиться эффекта, который хотите использовать с помощью Google REST. REST api вызывает https://developers.google.com/drive/v2/reference/

Вот как вы можете продолжить. Поскольку вы получаете контекст, вы можете совершать вызовы api для вождения. Для аутентификации, поскольку google следует OAuth 2.0, вы можете использовать эти вызовы api для достижения аутентификации https://developers.google.com/identity/