Аутентифікації і СИНХРОНІЗАЦІЯ в Android додатку

&nbsp

В Android 20 (API рівня 5) і вище зявилася можливість писати власні постачальники синхронізації для інтегрування з системними контактами, календарями і т д У такому випадку синхронізація з віддаленої службою є, на жаль, занадто ризикованою авантюрою, оскільки найменший збій на будь-якому етапі цього процесу попросту викличе крах системи Android і спровокує перезавантаження (причому практично неможливо буде зрозуміти, що саме пішло неправильно) Але в міру розвитку Android синхронізація також стає простіше і надійніше На даний момент цей процес протікає в два етапи: аутентифікація (Аутентифікатор облікових записів) і синхронізація (постачальник синхронізації)

Перш ніж приступити до детального розгляду двох цих етапів, відзначимо, що приклади, які ми тут наводимо, складаються з двох компонентів – серверної частини і клієнтської частини на самому пристрої Android Серверна частина, якою ми користуємося, – це проста серверна служба, приймаюча специфічні запити GET і видає відповідь у форматі JSON Релевантний URI запиту GET, а також приклад відповіді ми наводимо в кожній з розглянутих частин У вихідному коді, доданому до цієї книги, для повноти картини наведено весь серверний код

Слід також зазначити, що у що наводиться нами прикладі ми вирішили синхронізуватися з контактами облікового запису Але синхронізуватися можна не тільки з ними Можлива синхронізація з будь-яким постачальником вмісту, до якого у вас є доступ, і навіть з збереженими даними, специфічними для конкретного додатка

Аутентифікація

Щоб клієнт міг пройти аутентифікацію на віддаленому сервері за допомогою системи аутентифікації облікових записів, присутньої в Android, необхідні три елементи

Служба, яка запускається наміром android, accounts AccountAuthenticator і повертає у своєму методі onBind підклас AbstractAccountAuthenti cator

Активність, що запрошує користувача ввести свої облікові дані

XML-файл, що описує, як повинна виглядати обліковий запис, яка відображається користувачеві

Поговоримо спочатку про службу У файлі опису нам необхідно активувати

Потім служба повинна бути охарактеризована в файлі опису Зверніть увагу: намір android accounts AccountAuthenti cator включається в описувач іntent-fіlter Крім того, в файлі опису міститься інформація про ресурс для

AccountAuthenti cator:

Далі слід ресурс, який ми вказали в файлі опису Зокрема, він описує тип accountType, який відрізняє аутентифікатор від інших аутентифікатор, які використовують визначення даного облікового запису Акуратно працюйте з XML-документом (наприклад, не можна напряму привласнювати рядок android: label або допускати відсутність отрісовиваємих обєкта), оскільки в Android відбудеться крах системи в той самий момент, коли ви спробуєте додати новий обліковий запис (з налаштувань облікового запису та синхронізації):

Тепер, коли інформація про службу є в файлі опису, можна зайнятися самої службою Зверніть увагу: метод onBi nd () повертає клас Authenti cator Цей клас доповнює клас AbstractAccountAuthenti cator:

Перш ніж перейти до розгляду повного вихідного коду класу Authenti cator, слід згадати один важливий метод класу AbstractAccountAuthenti cator Він називається addAccount () Цей метод викликається саме в той момент, коли на екрані Add Account (Додати обліковий запис) ми вибираємо кнопку, відповідну нашої облікового запису Активність LoginActi vity (створена нами, запитує у користувача дані для входу) описується в намірі (Intent), який знаходиться в возвращаемом пакеті (Bund е) Дуже важливий ключ AccountManager KEY_ ACCOUNT_AUTHENTICATOR_RESPONSE, що входить до складу наміри, оскільки в ньому знаходиться обєкт AccountAuthenti catorResponse Цей обєкт потрібен, щоб доставити назад на пристрій ключі облікових записів, після того як користувач успішно пройде сертифікацію з віддаленої службою

Ось повний код активності Authenti cator, яка доповнює клас AbstractAccountAuthenti cator:

В даному випадку у віддаленого сервера є метод API входу в систему (доступний допомогою HTTP URI), який приймає імя користувача та пароль в якості змінних Якщо вхід в систему пройде успішно, відповідь повернеться з рядком у форматі JSON, і в цьому рядку міститиметься мітка (token):

Активність LoginActi vity, що вимагає від користувача ввести імя і пароль до облікового запису, потім встановлює контакт з віддаленим сервером Після того як буде повернута очікувана рядок у форматі JSON, викликається метод handl eLogi nResponse (), що передає важливу інформацію про обліковий запис назад до AccountManager:

XML макета активності LoginActivity такий:

Отже, обліковий запис створено, і ми можемо використовувати її для синхронізації даних

Синхронізація

Синхронізація даних певної облікового запису знову ж складається з трьох частин До її складу входять: служба, регистрируемая для слухання наміри androidcontentSyncAdapter і повертає методу onBindO доповнений клас AbstractThreadedSyncAdapter описатель XML, що повідомляє інформацію про структуру тих даних, які будуть синхронізуватися і проглядатися і, нарешті, клас, що доповнює AbstractThreadedSyncAdapter, – Він і займається самої синхронізацією

У нашому прикладі ми збираємося синхронізувати контактну інформацію з обліковим записом, описаної в попередньому розділі Зверніть увагу: синхронізувати можна не тільки контактну інформацію Можна синхронізуватися з будь-яким постачальником вмісту, до якого у вас є доступ, і навіть зі специфічними для конкретного додатка збереженими даними

У файлі опису прописуються наступні права доступу:

Тепер опишемо службу, з якою ми збираємося працювати Зверніть увагу на те, що тут присутній намір androidcontentSyncAdapter, а також вказується структура контактних даних та сам адаптер SyncAdapter:

У XML-pecypce для sync-adapter зверніть увагу на описувач accountType Вміст, з яким ми збираємося працювати, – це інформація про контакти Android:

Ось XML для описателя контактів Зверніть увагу на назви різних стовпців, описаних нами:

Створена нами служба SyncServi се повертає клас SyncAdapter Це створений нами клас, що доповнює AbstractThreadedSyncAdapter:

Продовжуючи дану вправу, створюємо метод getf ri ends на стороні віддаленого сервера Він приймає мітку, передану нам назад з сервера і збережену в результаті успішного входу в систему, – про це ми говорили вище Він також передає час, яке вказує, коли був зроблений останній виклик (якщо виклик був зроблений уперше – передається значення 0) Відповідь являє собою ще один рядок у форматі JSON, описує друзів (у тому числі сообщающую їх ID, імя та номер телефону) і вказує час, в яке був зроблений виклик (або Unix-час на сервері) Тут також наводиться історія додавання або видалення друзів у даного облікового запису В історії в поле type може стояти значення 0 або 1 Перше відповідає додаванню одного, другого – видаленню Поле who містить ID друга, а поле time повідомляє, коли була проведена операція:

Далі слід клас AbstractThreadedSyncAdapter, що доповнює SyncAdapter:

Далі наведено весь клас SyncAdapter, що містить різні дії, які відбуваються, коли метод синхронізації отримує дані Тут же включені різні додавання і видалення контактної інформації:

У попередньому класі SyncAdapter легко упустити важливу деталь Вона полягає в наступному: під час виклику onPerf ormSync () ми намагаємося отримати authtoken від AccountManager і користуємося при цьому методом blockingGetAuthTokenO У підсумку це призводить до виклику AbstractAccountAuthenti cator, повязаного з даною обліковим записом У цьому випадку відбувається виклик класу Authenti cator, розглянутого нами в попередньому розділі У класі Authenti cator викликається метод getAuth-TokenO Розглянемо цю ситуацію на прикладі:

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*