КОМУНІКАЦІЯ БЛИЗЬКОГО ПОЛЯ (NFC) в Android додатку

&nbsp

Комунікація ближнього поля – це технологія близкодействии (до 20 см), високочастотної бездротової комунікації Це стандарт, що доповнює більш великий стандарт радіочастотної ідентифікації (РЧІД), комбінує інтерфейс смарт-карти і зчитувача в єдиний пристрій Даний стандарт спочатку розроблявся для використання з мобільними телефонами, тому він вельми зацікавив виробників, які шукали способи безконтактної передачі даних (наприклад, при використанні кредитних карток) Стандарт дозволяє використовувати комунікацію ближнього поля декількома способами

Емуляція карти Пристрій – картка безконтактного зчитування, тому з нього можуть отримувати інформацію інші зчитувачі

Режим зчитування Пристрій може зчитувати мітки РЧІД (радіочастотна ідентифікація)

Спеціальний робочий режим Між двома пристроями встановлюється пряма і зворотна комунікація для обміну даними

В Android 23 (API рівня 9) Google реалізував функціональність режиму зчитування при комунікації ближнього поля Починаючи з Android 233 (API рівня 10), також зявилася можливість запису даних у мітку NFC і обміну даними тимчасовий режим (Р2Р)

Мітки комунікації ближнього поля складаються з даних, закодованих у форматі для обміну даними при комунікації ближнього поля (NDEF) Цей формат регламентується в специфікації NFC Forum Туре 2 Кожне NDEF-повідомлення складається з однієї або більше записів NDEF Офіційна технічна специфікація комунікації ближнього поля розташована за адресою http:// wwwnfc-forumorg/ Для розробки і тестування зчитувального програми, що використовує комунікацію ближнього поля, настійно рекомендується придбати NFC-сумісний пристрій (наприклад, Nexus S, см http://wwwgooglecom/ phone / detail / nexus-s) і використовувати NFC-сумісну мітку

Для застосування функцій комунікації ближнього поля у вашому додатку необхідно оголосити в файлі опису наступне право доступу:

&ltuses-permission android:name=&quotandroidpermissionNFC&quot /&gt

Щоб допустити установку програми лише на ті пристрої, які підтримують NFC, додайте в файл опису та наступний рядок:

&ltuses-feature android:name=&quotandroidhardwarerife&quot /&gt

Зчитування мітки

Режим зчитування призначений для отримання повідомлень при скануванні РЧІД / NFC мітки В Android 23 (API рівня 9) єдиний спосіб реалізації такої функції – створити активність, яка буде слухати наміри android, nf caction TAGDISCOVERED, які широкомовною способом повідомляють про те, що в даний момент зчитується мітка В Android 233 (API рівня 10) надаються більш великі кошти для отримання таких повідомлень відповідно до процесом, показаним на рис 162

Рис 162 Потік міток комунікації ближнього поля в Android 233 (API рівня 10)

В Android 233 (API рівня 10) і вище при виявленні мітки NFC обєкт мітки (Parcel able) поміщається в намір (Intent) як EXTRATAG Потім система починає відстежувати логічний потік, щоб знайти активність, якої найкраще буде направити намір Такий механізм розроблений для того, щоб забезпечити високу ймовірність напрямки мітки до підходящої активності без виведення користувачеві діалогового вікна для вибору активності (тобто зробити це прозорим чином) і, таким чином, перешкодити обриву зєднання між міткою і пристроєм Цей обрив може бути спровокований непотрібним втручанням користувача Перше, що необхідно перевірити, – дізнатися, чи є на передньому плані якась активність, яка викликала метод enableForegroundDispatch () Якщо це так, то намір передається активності і на цьому процес завершується Якщо ж ні, то система перевіряє перший запис NdefRecord в першому NdefMessage даних тега Якщо NdefRecord – це унікальний ідентифікатор ресурсу (URI), розсилка Smart Poster або інформація про тип МІМЕ, то система перевіряє наявність активності, зареєстрованої на отримання наміри ACTION_NDEF_ DISCOVERED (android nfс Action NDEF_DISCOVERED) з потрібним типом даних Якщо такий намір існує, то відповідна для його обробки активність (чим точніше збіг, тим краще) отримує намір – і на цьому все завершується Якщо і ці умови не виконуються, то система шукає активність, зареєстровану на отримання ACTION_TECH_DISCOVERED і відповідну для специфічного набору технологій, відповідного мітці (знову ж чим точніше збіг, тим краще) Якщо збіг мається, то намір передається такої активності – і рішення знайдено Тим не менш, якщо не знайдеться активність, яка пройшла б попередні перевірки, намір у результаті буде передано як дія ACTION_TAG_DISCOVERED, і саме так відбувалася б обробка мітки у версії Android 23 (API рівня 9)

Щоб гарантувати, що саме активність, яка знаходиться на передньому плані, була першою в черзі на отримання мітки, потрібно отримувати адаптер пристрої комунікації ближнього поля і викликати enabl eForegroundDi spatch з посиланням на контекст активності Конкретний адаптер пристрої комунікації ближнього поля представлений класом NfcAdapter Щоб отримати точний адаптер конкретного пристрою, необхідно запустити getDef aul tAdapter () у версії Android 23 (API рівня 9) або getDef aul tAdapter (context) в Android 233 (API рівня 10):

Коли адаптер пристрої комунікації ближнього поля отриманий, потрібно створити намір Pendinglntent і передати його методом enableForegroundDispatchO Цей метод повинен викликатися з основного потоку і тільки в тому випадку, якщо цікавить нас активність знаходиться на передньому плані (після виклику методу

onResume ()):

Виключно важливо те, що, коли активність йде з переднього плану (при виклику методу onPause ()), ви повинні викликати метод disableForegroundDispatchO:

Якщо активність зареєстрована на ACTION_NDEF_DISCOVERED, ця активність повинна мати фільтр намірів (intent-fіlter) android nfс action NDEF_DISCOVERED і всі фільтри для конкретних (специфічних) даних у файлі опису:

Це ж стосується випадку з TECHDISCOVERED (в наступний приклад також включений ресурс метаданих, що описує специфічну технологію Цей ресурс вказано в мітці комунікації ближнього поля, і цю технологію ми будемо розглядати більш докладно Наприклад, мова може йти про інформацію у форматі NDEF):

Коли мітка лічена, система широкомовною чином передає намір, причому його інформаційне наповнення (корисне навантаження) виступає в якості асоційованих даних В Android 233 (API рівня 10) тут також міститься обєкт Tag (в якості EXTRA_TAG) Цей обєкт Tag надає кошти для отримання конкретної TagTechnology і для виконання складних операцій (наприклад, введення-виведення) Необхідно враховувати, що масиви (Array), що передаються цього класу і які повертаються ним, не клонуються, тому будьте обережні і не змінюйте їх:

В Android 23 (API рівня 9) і вище ідентифікатор (ID) мітки укладений всередині наміри і зашифрований рядком android nf с extra ID (NfcAdapter EXTRA_ID) як масив байтів:

Дані упаковані у вигляді масиву Parcel abl е-обєктів (NdefMessage), зашифрованих рядком androidnf с extra NDEF MESSAGES (NfcAdapterEXTRA NDEF MESSAGES):

Усередині кожного повідомлення NdefMessage знаходиться масив з NdefRecord У цьому записі завжди буде присутній 3-бітний TNF (type name format, формат імені типу), тип запису, унікальний ідентифікатор і корисне навантаження Детальніше цей склад розглядається в документі NdefRecord за адресою http://developerandroid com / reference / android / nfc / NdefRecordhtml В даний час відомо кілька таких типів, чотири найбільш поширених з них – TEXT, URI, SMART_POSTER і ABSOLUTEJJRI – ми розглянемо нижче:

Для зчитування корисного навантаження типу NdefRecord RTD_TEXT перший байт цієї інформації визначає статус і відповідно тип кодування текстової корисного навантаження:

При зчитуванні корисного навантаження стандартного унікального ідентифікатора ресурсу (тип NdefRecordRTDJJRI) перший байт корисного навантаження визначає префікс URI:

При вказівці абсолютного URI (тип NdefRecord TNF_ABSOLUTE_URI) вся корисне навантаження має кодування UTF-8 і становить весь URI:

Особливий тип Smart Poster (NdefRecordRTD_SMART_POSTER) складається з безлічі підзаписів тексту або даних URI (або абсолютних URI):

Запис у мітку

Вже в Android 233 (API рівня 10) зявилася можливість запису даних у мітку Для цього використовується обектТад, який застосовується для отримання в мітці підходящої TagTechnol оду Мітки комунікації ближнього поля працюють на основі незалежно розроблених технологій і пропонують широкий спектр можливостей Реалізації TagTechnol оду забезпечують доступ до цих різними технологіями і можливостям У нашому випадку технологія NDEF потрібно для отримання та зміни в мітці інформації NdefRecords і NdefMessage:

При здійсненні операцій введення-виведення із застосуванням TagTechnol оду необхідно дотримуватися таких вимог

Перед використанням будь-якої наступної операції введення-виведення потрібно викликати метод connect ()

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

Одноразово можна встановлювати зєднання лише з одного TagTechnol оду Інші виклики connect () видаватимуть виняток IOException

Метод close () слід викликати після завершення операцій введення-виведення з TagTechnol оду Цей метод буде скасовувати всі інші заблоковані операції введення-виведення в інших потоках (у тому числі connect ()), видаючи виняток IOException

Отже, щоб записати дані в мітку, метод connect () викликається з потоку, працюючого окремо від головного потоку Коли це зроблено, и sConnected () слід перевірити, щоб переконатися, що зєднання встановлено Якщо воно встановлено, то можна викликати метод writeNdefMessage () із створеним повідомленням NdefMessage (що містить не менше одного запису NdefRecord) Після того як дані записані, викликається close () для завершення процесу

Повний код для внесення текстового запису в мітку з використанням посилання на NDEF TagTechnol оду такий:

Спеціальний робочий режим

Спеціальний робочий режим (peer-to-peer mode, Р2Р) активується в Android 233 (API рівня 10), коли один пристрій має передавати дані іншому за технологією комунікації ближнього поля, причому другий пристрій здатне приймати дані, одержувані при такій комунікації Відправляє пристрій також може отримувати інформацію з пристрою одержувача, в цьому і полягає одноранговая комунікація Для її здійснення використовується метод enabl eFore-groundNdefPush () класу NfcAdapter У результаті активність для передачі повідомлення NdefMessage (якщо вона знаходиться на передньому плані) може передати його іншому пристрою, пристосованому для комунікації ближнього поля і підтримуючого протокол відправки NDEF comandroidnpp Метод enableForegroundNdefPush () слід викликати з основного потоку (як і у випадку з onResume ()):

Коли метод enabl eForegroundNdef Push Про активний, стандартна диспетчеризація міток відключена Лише активність, що знаходиться на передньому плані, може отримувати знайдену по мітці інформацію за допомогою методу enabl eForegroundDi spatchC)

Важливо відзначити, що коли активність йде з переднього плану (onPauseO), викликається метод di sabl eForegroundNdefPush ():

Джерело: 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>

*

*