يصف هذا المستند مهام NFC الأساسية التي تؤديها في Android. يشرح كيفية إرسال تلقّي بيانات NFC على شكل رسائل NDEF ووصف واجهات برمجة التطبيقات لإطار عمل Android التي تتوافق هذه الميزات. وللمزيد من المواضيع المتقدمة، بما في ذلك مناقشة كيفية التعامل مع بيانات غير تابعة لـ NDEF، راجِع الاتصال القصير المدى (NFC) المتقدّمة.
هناك حالتا استخدام رئيسيتان عند التعامل مع بيانات NDEF وAndroid:
- قراءة بيانات NDEF من علامة NFC
- إرسال رسائل NDEF من جهاز إلى آخر باستخدام Android BeamTM
تتم معالجة قراءة بيانات NDEF من علامة NFC من خلال إرسال العلامة. ، الذي يحلّل علامات NFC المكتشفة ويصنّف البيانات بشكل مناسب ويبدأ أحد التطبيقات المهتمة بالبيانات المصنفة. يريد تطبيق يريد معالجة يمكن لعلامة NFC التي تم مسحها ضوئيًا تعريف فلتر أهداف طلب معالجة البيانات.
تسمح ميزة Android BeamTM للجهاز بإرسال رسالة NDEF إلى على جهاز آخر من خلال التلامس بين الجهازين معًا. يوفر هذا التفاعل طريقة أسهل لإرسال البيانات مقارنةً بالتكنولوجيا اللاسلكية الأخرى، مثل البلوتوث، لأنّه لا يمكن استخدام الجهاز اليدوي أو الاكتشاف أو الإقران. يتم بدء الاتصال تلقائيًا عند توصيل جهازين ضمن النطاق. يتوفر شعاع Android من خلال مجموعة من واجهات برمجة تطبيقات NFC، حتى يتمكن أي تطبيق من الإرسال المعلومات بين الأجهزة. فعلى سبيل المثال، تستخدم تطبيقات جهات الاتصال والمتصفح وYouTube شعاع Android لمشاركة جهات الاتصال وصفحات الويب والفيديوهات مع الأجهزة الأخرى
نظام إرسال العلامات
تبحث الأجهزة التي تعمل بنظام التشغيل Android عادةً عن علامات NFC عندما تظهر الشاشة بدون قفل، ما لم يتم إيقاف NFC في قائمة إعدادات الجهاز. عندما يكتشف جهاز يعمل بنظام تشغيل Android علامة NFC، يصبح السلوك المطلوب أن يكون النشاط الأكثر ملاءمةً لهدف المستخدم بدون سؤال المستخدم عن نوع التطبيق للاستخدام. بما أنّ الأجهزة تفحص علامات NFC على نطاق قصير جدًا، من المرجّح أن يؤدي ذلك إلى إجراء المستخدمين يدويًا. تحديد نشاط، ما سيجبره على نقل الجهاز بعيدًا عن العلامة وقطع الاتصال. يجب تطوير نشاطك لمعالجة علامات NFC التي يهتم بها نشاطك فقط. منع ظهور محدد النشاط.
ولمساعدتك على تحقيق هذا الهدف، يوفِّر Android نظامًا خاصًا لإرسال العلامات يحلل البيانات التي يتم فحصها علامات NFC وتحلِّلها وتحاول تحديد مكان التطبيقات المهتمة بالبيانات الممسوحة ضوئيًا. أُنشأها جون هنتر، الذي كان متخصصًا عن طريق:
- تحليل علامة NFC ومعرفة نوع MIME أو معرف موارد منتظم (URI) لتحديد حمولة البيانات في العلامة.
- تغليف نوع MIME أو معرّف الموارد المنتظم (URI) والحمولة في غرض هذان أول اثنان في كيفية تعيين علامات NFC لأنواع MIME ومعرّفات الموارد المنتظمة (URI).
- يؤدي هذا الخيار إلى بدء نشاط استنادًا إلى هدفه. يتم وصف ذلك في كيفية نقل علامات NFC إلى التطبيقات.
كيفية ربط علامات NFC بأنواع MIME ومعرّفات الموارد المنتظمة (URI)
قبل البدء في كتابة تطبيقات NFC، من المهم أن تفهم الأنواع المختلفة أنواع علامات NFC، وطريقة تحليل نظام إرسال العلامات لعلامات NFC، والعمل الخاص الذي تنفذه العلامة نظام الإرسال عندما يكتشف رسالة NDEF. تأتي علامات NFC في مجموعة واسعة من التقنيات ويمكن أيضًا كتابة البيانات إليهم بعدة طرق مختلفة. يتوافق Android مع معيار NDEF بدرجة كبيرة، وهو المعيار المحدّد في منتدى NFC.
يتم تغليف بيانات NDEF داخل رسالة (NdefMessage
) تحتوي على واحد
أو أكثر من السجلات (NdefRecord
). يجب أن يكون كل سجل NDEF مُصاغًا بشكل جيد وفقًا
وتحديد نوع السجل الذي تريد إنشاءه. جهاز Android
تتيح أيضًا أنواعًا أخرى من العلامات التي لا تحتوي على بيانات NDEF، والتي يمكنك العمل عليها باستخدام
الصفوف في حزمة android.nfc.tech
. معرفة المزيد
حول هذه التكنولوجيات، يمكنك الاطّلاع على موضوع حول تقنية الاتصال القصير المدى (NFC) المتقدّمة. يتضمن العمل مع هذه الأنواع الأخرى من العلامات
وكتابة حزمة البروتوكولات الخاصة بك للتواصل مع العلامات، لذلك ننصحك باستخدام واجهة NDEF عند
لسهولة التطوير وأقصى دعم للأجهزة التي تعمل بنظام التشغيل Android.
ملاحظة: لتنزيل مواصفات NDEF الكاملة، يُرجى الانتقال إلى مواصفات منتدى NFC مستندات التطبيق والاطلاع على إنشاء أنواع شائعة من سجلات NDEF للاطّلاع على أمثلة حول كيفية إنشاء سجلات NDEF.
والآن بعد أن أصبح لديك بعض المعلومات الأساسية عن علامات NFC، تصف الأقسام التالية بمزيد من التفصيل كيف
يتعامل Android مع علامات NDEF المنسّقة. عندما يفحص جهاز يعمل بنظام التشغيل Android علامة NFC تحتوي على NDEF
البيانات المنسقة، فهي تحلّل الرسالة وتحاول معرفة نوع MIME للبيانات أو تحديد
معرّف الموارد المنتظم (URI). ولإجراء ذلك، يقرأ النظام أول NdefRecord
في NdefMessage
لتحديد كيفية تفسير رسالة NDEF بالكامل (يمكن لرسالة NDEF أن
لديهم سجلات NDEF متعددة). في رسالة NDEF مكتوبة بشكل جيد، يكون أول NdefRecord
يحتوي على الحقول التالية:
- TNF 3 بت (تنسيق اسم النوع)
- تشير إلى كيفية تفسير حقل نوع الطول المتغير. القيم الصالحة هي كما هو موضح في الجدول 1.
- نوع متغير الطول
- يصف هذا العمود نوع السجلّ. في حال استخدام
TNF_WELL_KNOWN
، استخدِم هذا الحقل لتحديد تعريف نوع السجلّ (RTD). ويتم توضيح قيم الوقت الفعلي الصالحة في الجدول 2. - رقم تعريف متغير الطول
- معرّف فريد للسجلّ. لا يتم استخدام هذا الحقل كثيرًا، ولكن إذا كنت بحاجة إلى تعريف علامة بشكل فريد، يمكنك إنشاء رقم تعريف لها.
- الحمولة متغيّرة الطول
- حمولة البيانات الفعلية التي تريد قراءتها أو كتابتها NDEF يمكن أن تحتوي الرسالة على سجلات NDEF متعددة، لذا لا تفترض أن الحمولة الكاملة موجودة في أول وحدة NDEF سجل رسالة NDEF.
يستخدم نظام إرسال العلامات حقلي TNF والنوع لمحاولة تعيين نوع MIME أو معرّف موارد منتظم (URI) إلى
NDEF. وفي حال نجاح هذا الإجراء، سيتضمّن هذه المعلومات داخل هدف ACTION_NDEF_DISCOVERED
مع الحمولة الفعلية. ومع ذلك،
هي الحالات التي يتعذّر فيها على نظام إرسال العلامات تحديد نوع البيانات بناءً على أول NDEF
تسجيل. ويحدث ذلك في حال تعذّر ربط بيانات NDEF بنوع MIME أو معرّف موارد منتظم (URI)، أو عندما
لا تحتوي علامة NFC على بيانات NDEF للبدء. في هذه الحالات، يتم تضمين عنصر Tag
الذي يحتوي على معلومات عن تقنيات العلامة والحمولة.
مغلَّفة داخل هدف ACTION_TECH_DISCOVERED
بدلاً من ذلك.
يصف الجدول 1 كيفية تعيين نظام إرسال العلامات TNF والنوع.
إلى أنواع MIME أو معرّفات الموارد المنتظمة (URI). وتصف أيضًا ملفات TNF التي لا يمكن ربطها بنوع MIME أو معرّف موارد منتظم (URI).
في هذه الحالات، يعود نظام إرسال العلامات إلى
ACTION_TECH_DISCOVERED
على سبيل المثال، إذا صادف نظام إرسال العلامات سجلاً من النوع TNF_ABSOLUTE_URI
، سيتم ربط حقل نوع متغير الطول لهذا السجلّ.
إلى معرف موارد منتظم (URI). يتضمّن نظام إرسال العلامات معرّف الموارد المنتظم (URI) هذا في حقل البيانات الخاص بالهدف ACTION_NDEF_DISCOVERED
إلى جانب معلومات أخرى عن العلامة.
مثل الحمولة. من ناحية أخرى، إذا صادفت العلامة سجلاً من النوع TNF_UNKNOWN
، فإنها تنشئ هدفًا يتضمّن تقنيات العلامة
بدلاً من ذلك.
الجدول 1. ملفات TNF المتوافقة وتعييناتها
النوع تنسيق الاسم (TNF) | تعيين |
---|---|
TNF_ABSOLUTE_URI |
عنوان URI يستند إلى حقل النوع. |
TNF_EMPTY |
يعود إلى ACTION_TECH_DISCOVERED . |
TNF_EXTERNAL_TYPE |
عنوان URI يستند إلى رقم تعريف المستخدم (URN) في حقل النوع. يتم تشفير URN في حقل نوع NDEF في
نموذج مختصر: <domain_name>:<service_name> .
يربط Android ذلك بمعرّف الموارد المنتظم (URI) بالتنسيق التالي:
vnd.android.nfc://ext/<domain_name>:<service_name> |
TNF_MIME_MEDIA |
نوع MIME استنادًا إلى حقل النوع. |
TNF_UNCHANGED |
غير صالح في السجل الأول، لذلك يعود إلى
ACTION_TECH_DISCOVERED |
TNF_UNKNOWN |
يعود إلى ACTION_TECH_DISCOVERED . |
TNF_WELL_KNOWN |
نوع MIME أو معرف موارد منتظم (URI) استنادًا إلى تعريف نوع السجلّ (RTD)، الذي تضبطه في النوع. راجِع الجدول 2 للحصول على مزيد من المعلومات عن والخطط المباشرة المتاحة وتخطيطاتها. |
الجدول 2. أوقات الاستجابة السريعة المتوافقة مع TNF_WELL_KNOWN و التعيينات
تعريف نوع السجلّ (RTD) | تعيين |
---|---|
RTD_ALTERNATIVE_CARRIER |
يعود إلى ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_CARRIER |
يعود إلى ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_REQUEST |
يعود إلى ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_SELECT |
يعود إلى ACTION_TECH_DISCOVERED . |
RTD_SMART_POSTER |
يعتمد معرف الموارد المنتظم (URI) على تحليل الحمولة. |
RTD_TEXT |
نوع MIME لـ text/plain . |
RTD_URI |
عنوان URI يستند إلى الحمولة. |
كيفية إرسال علامات NFC إلى التطبيقات
عندما ينتهي نظام إرسال العلامات من إنشاء هدف يضم علامة NFC معلومات تعريفية، فإنها تُرسل الغرض إلى تطبيق مهتم فلاتر للأهداف إذا كان بإمكان أكثر من تطبيق واحد معالجة الغرض، فإن منتقي النشاط حتى يتمكن المستخدم من اختيار النشاط. يحدد نظام إرسال العلامات ثلاثة أغراض، يتم سردها بالترتيب من أعلى إلى أدنى أولوية:
-
ACTION_NDEF_DISCOVERED
: يُستخدَم هذا الغرض لبدء نشاط يتم فحصه عند مسح علامة تحتوي على حمولة NDEF وتكون من نوع معروف. هذا هو النية ذات الأولوية القصوى، ويحاول نظام إرسال العلامات بدء نشاط بهذا الشكل النية قبل أي نية أخرى، كلما أمكن ذلك. ACTION_TECH_DISCOVERED
: في حال عدم تسجيل أي أنشطة في التعامل معACTION_NDEF_DISCOVERED
يحاول نظام إرسال العلامات بدء تطبيق بهذا الغرض. هذا النمط تبدأ intent أيضًا مباشرةً (بدون بدءACTION_NDEF_DISCOVERED
أولاً) إذا كانت العلامة التي يتم مسحها ضوئيًا يحتوي على بيانات NDEF لا يمكن ربطها بنوع MIME أو معرف موارد منتظم (URI)، أو إذا كانت العلامة لا تحتوي على NDEF البيانات ولكنه من تقنية علامة معروفة.ACTION_TAG_DISCOVERED
: تم بدء هذا الغرض. في حال عدم توفّر أنشطة تعالجACTION_NDEF_DISCOVERED
أوACTION_TECH_DISCOVERED
الأهداف.
في ما يلي الطريقة الأساسية التي يعمل بها نظام إرسال العلامات:
- جرِّب بدء نشاط بهدف أنشأه نظام إرسال العلامات.
عند تحليل علامة NFC (إما
ACTION_NDEF_DISCOVERED
أوACTION_TECH_DISCOVERED
). - في حال عدم توفّر أنشطة للفلترة وفقًا لهذا القصد، جرِّب بدء النشاط بالنوع التالي.
الغرض الأدنى من الأولوية (إما
ACTION_TECH_DISCOVERED
أوACTION_TAG_DISCOVERED
) إلى أن تتم فلترة أحد التطبيقات حسب النية أو إلى أن يجرِّب نظام إرسال العلامات جميع الأهداف الممكنة. - وفي حال عدم فلترة أي تطبيقات بحثًا عن أي من الأهداف، لا تتخذ أي إجراء.
![](https://developer.android.com/static/images/nfc_tag_dispatch.png?authuser=9&hl=ar)
استخدِم، كلما أمكن، مع رسائل NDEF وهدف ACTION_NDEF_DISCOVERED
لأنّه الأكثر تحديدًا
الثلاثة. يسمح لك هذا الغرض ببدء تقديم الطلب في وقت أكثر ملاءمة من
غرضين آخرين، لمنح المستخدم تجربة أفضل.
طلب الوصول إلى NFC في بيان Android
قبل التمكّن من الوصول إلى معدّات NFC على الجهاز والتعامل مع أهداف NFC بشكل صحيح، يجب الإفصاح عن هذه المعلومات
العناصر في ملف AndroidManifest.xml
:
- عنصر
<uses-permission>
NFC للوصول إلى أجهزة NFC:<uses-permission android:name="android.permission.NFC" />
- يشير إلى الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) الذي يمكن لتطبيقك دعمه. يتوافق المستوى 9 من واجهة برمجة التطبيقات فقط مع
نقل محدود للعلامات عبر
ACTION_TAG_DISCOVERED
، ولا تمنح إلا الوصول إلى رسائل NDEF عبر إضافةEXTRA_NDEF_MESSAGES
. لا يمكن الوصول إلى خصائص العلامات الأخرى أو عمليات الإدخال والإخراج. المستوى 10 من واجهة برمجة التطبيقات يتضمّن دعمًا شاملاً للقارئ/الكتابة، بالإضافة إلى إرسال وظيفة NDEF في المقدّمة ومستوى واجهة برمجة التطبيقات 14 طريقة أسهل لإرسال رسائل NDEF إلى الأجهزة الأخرى باستخدام ميزة "شعاع Android" المناسبة لإنشاء سجلات NDEF.<uses-sdk android:minSdkVersion="10"/>
- العنصر
uses-feature
الذي يظهر تطبيقك في Google Play للأجهزة التي تتضمّن أجهزة NFC فقط:<uses-feature android:name="android.hardware.nfc" android:required="true" />
إذا كان التطبيق يستخدم وظيفة NFC، ولكن هذه الوظيفة ليست أساسية يمكنك حذف العنصر
uses-feature
والتحقق من مدى توفُّر تقنية NFC على عن طريق التحقق لمعرفة ما إذا كانتgetDefaultAdapter()
يبلغnull
.
الفلترة للوصول إلى أهداف NFC
لبدء التطبيق عند مسح علامة NFC التي تريد التعامل معها ضوئيًا، يجب على التطبيق
يمكنه تصفية هدف واحد أو اثنين أو جميعها من نية NFC في بيان Android. ومع ذلك،
يريدون عادةً إجراء فلترة للوصول إلى ACTION_NDEF_DISCOVERED
المقصود من أجل
تحكمًا أكبر في وقت بدء تشغيل تطبيقك. الغرض ACTION_TECH_DISCOVERED
هو إجراء احتياطي لـ ACTION_NDEF_DISCOVERED
في حال عدم توفّر إمكانية فلترة لتطبيقات
ACTION_NDEF_DISCOVERED
أو عندما لا تكون الحمولة
NDEF. عادةً ما تكون الفلترة للعثور على ACTION_TAG_DISCOVERED
عامة جدًا من
الفئة التي ستتم التصفية إليها. ستتم فلترة العديد من التطبيقات بحثًا عن ACTION_NDEF_DISCOVERED
أو ACTION_TECH_DISCOVERED
قبل ACTION_TAG_DISCOVERED
، وبالتالي فإنّ احتمالية أن يكون تطبيقك منخفضًا
البدء. يتوفّر ACTION_TAG_DISCOVERED
كحلٍ أخير فقط.
لتصفيتها في الحالات التي لا يتم فيها تثبيت أي تطبيقات أخرى لمعالجة
الهدف "ACTION_NDEF_DISCOVERED
" أو "ACTION_TECH_DISCOVERED
"
بما أنّ عمليات نشر علامات NFC تختلف وقد لا تكون تحت سيطرتك في كثير من الأحيان، لا يكون هذا الأمر دائمًا من الممكن، وهذا هو السبب في أنه يمكنك الرجوع إلى الهدفين الآخرين عند الضرورة. عندما يكون لديك التحكم في أنواع العلامات والبيانات المكتوبة، يوصى باستخدام NDEF لتنسيق . توضّح الأقسام التالية كيفية الفلترة حسب كل نوع من أنواع النية.
ACTION_NDEF_DISCOVERED
لفلترة ACTION_NDEF_DISCOVERED
هدفًا، يجب تعريفه
فلتر الأهداف مع نوع البيانات التي تريد إجراء الفلترة للحصول عليها. تشير رسالة الأشكال البيانية
أمثلة الفلاتر التالية على ACTION_NDEF_DISCOVERED
الأغراض التي تتضمّن نوع MIME وهو text/plain
:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> </intent-filter>
المثال التالي عوامل التصفية لعنوان URI في شكل
https://developer.android.com/index.html
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
تم اكتشاف ACTION_TECH_
إذا تمت فلترة نشاطك حسب نية ACTION_TECH_DISCOVERED
،
عليك إنشاء ملف XML للموارد يحدّد التكنولوجيات التي يتيحها نشاطك.
ضمن مجموعة tech-list
. نشاطك
تُعتبر مطابقة إذا كانت مجموعة tech-list
هي مجموعة فرعية من التكنولوجيات
متوافقة مع العلامة، والتي يمكنك الحصول عليها من خلال طلب الرقم getTechList()
.
على سبيل المثال، إذا كانت العلامة التي تم مسحها ضوئيًا متوافقة مع Mifare Classic وNdefFormatable وNfcA، يجب اتّباع الخطوات التالية:
يجب أن تحدد مجموعة tech-list
جميع التقنيات الثلاثة أو اثنين أو إحدى التقنيات (وليس
غير ذلك) لمطابقة نشاطك.
يحدد النموذج التالي جميع التقنيات. يجب عليك إزالة تلك التي لم يتم استخدامها
متوافقة مع علامة NFC احفظ هذا الملف (يمكنك تسميته أي شيء تريده) في
مجلد واحد (<project-root>/res/xml
).
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech> <tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech> </tech-list> </resources>
ويمكنك أيضًا تحديد مجموعات tech-list
متعدّدة. كل من tech-list
تُعتبَر المجموعات متطابقة بشكل مستقل، ويُعتبر نشاطك مطابقًا إذا
المجموعة tech-list
هي مجموعة فرعية من التكنولوجيات التي يتم إرجاعها من خلال getTechList()
. يوفّر هذا الإجراء إمكانية الوصول إلى AND
وOR
.
دلالات الألفاظ لتقنيات المطابقة. يتطابق المثال التالي مع العلامات التي تتيح استخدام علامة
تقنيات NFCA وNdef أو يمكنها دعم تقنيات NfcB وNdef:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
في ملف AndroidManifest.xml
، حدِّد ملف المورد الذي أنشأته للتو.
في العنصر <meta-data>
داخل <activity>
كما هو موضح في المثال التالي:
<activity> ... <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> ... </activity>
لمزيد من المعلومات عن استخدام تكنولوجيات العلامات وهدف ACTION_TECH_DISCOVERED
، يُرجى الاطّلاع على العمل باستخدام علامة متوافقة.
التكنولوجيات المتوفّرة في مستند NFC المتقدّم.
ACTION_TAG_تم اكتشافه
لفلترة ACTION_TAG_DISCOVERED
، استخدِم الغرض التالي.
الفلتر
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
الحصول على معلومات من الأهداف
إذا بدأ نشاط بهدف تقنية NFC، يمكنك الحصول على معلومات حول NFC الممسوحة ضوئيًا من الغرض. يمكن أن تحتوي الأهداف على العناصر الإضافية التالية اعتمادًا على العلامة التي تم فحصها:
EXTRA_TAG
(مطلوب): كائنTag
التي تمثل العلامة الممسوحة ضوئيًا.EXTRA_NDEF_MESSAGES
(اختياري): مصفوفة من رسائل NDEF من العلامة. يعد هذا المبلغ الإضافي إلزاميًا فيACTION_NDEF_DISCOVERED
هدفًا.EXTRA_ID
(اختياري): رقم التعريف المنخفض المستوى للعلامة.
للحصول على هذه الميزات الإضافية، تحقق مما إذا كان قد تم إطلاق نشاطك باستخدام أحد
إجراءات NFC للتأكد من فحص العلامة ضوئيًا، ثم الحصول على الميزات الإضافية من
والنية. يتحقق المثال التالي من عملية التحقق من ACTION_NDEF_DISCOVERED
.
ويحصل على رسائل NDEF من نية إضافية.
Kotlin
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) ... if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages -> val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage } // Process the messages array. ... } } }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); ... if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMessages != null) { NdefMessage[] messages = new NdefMessage[rawMessages.length]; for (int i = 0; i < rawMessages.length; i++) { messages[i] = (NdefMessage) rawMessages[i]; } // Process the messages array. ... } } }
ويمكنك بدلاً من ذلك الحصول على كائن Tag
من الغرض، ما سيؤدي إلى
تحتوي على الحمولة وتسمح لك بتعداد تقنيات العلامة:
Kotlin
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
Java
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
إنشاء أنواع شائعة من سجلات NDEF
يصف هذا القسم كيفية إنشاء أنواع شائعة من سجلات NDEF لمساعدتك عند كتابة
علامات NFC أو إرسال البيانات باستخدام ميزة "شعاع Android". بدءًا من الإصدار Android 4.0 (المستوى 14 من واجهة برمجة التطبيقات)،
تتوفّر طريقة createUri()
لمساعدتك في إنشاء المحتوى.
يتم تسجيل معرف الموارد المنتظم (URI) تلقائيًا. بدءًا من الإصدار 4.1 من نظام التشغيل Android (المستوى 16 من واجهة برمجة التطبيقات)،
createExternal()
وcreateMime()
متاحة لمساعدتك في إنشاء
سجلات MIME والنوع الخارجي NDEF. استخدِم هذه الطرق الداعمة كلما أمكن ذلك لتجنُّب الأخطاء.
عند إنشاء سجلات NDEF يدويًا.
يصف هذا القسم أيضًا كيفية إنشاء واجهة فلتر الأهداف للسجلّ. يجب أن تكون جميع أمثلة سجلات NDEF في أول NDEF سجل رسالة NDEF التي تكتبها لعلامة أو ترسل إليها.
TNF_ABSOLUTE_URI
ملاحظة: نقترح عليك استخدام
اكتب RTD_URI
بدلاً من ذلك
TNF_ABSOLUTE_URI
لأنها أكثر كفاءة.
يمكنك إنشاء سجلّ NDEF TNF_ABSOLUTE_URI
بالطريقة التالية
:
Kotlin
val uriRecord = ByteArray(0).let { emptyByteArray -> NdefRecord( TNF_ABSOLUTE_URI, "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")), emptyByteArray, emptyByteArray ) }
Java
NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]);
سيظهر فلتر الأهداف لسجلّ NDEF السابق على النحو التالي:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
TNF_MIME_MEDIA
يمكنك إنشاء سجلّ NDEF TNF_MIME_MEDIA
بالطرق التالية:
باستخدام الطريقة createMime()
:
Kotlin
val mimeRecord = NdefRecord.createMime( "application/vnd.com.example.android.beam", "Beam me up, Android".toByteArray(Charset.forName("US-ASCII")) )
Java
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam", "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
إنشاء NdefRecord
يدويًا:
Kotlin
val mimeRecord = Charset.forName("US-ASCII").let { usAscii -> NdefRecord( NdefRecord.TNF_MIME_MEDIA, "application/vnd.com.example.android.beam".toByteArray(usAscii), ByteArray(0), "Beam me up, Android!".toByteArray(usAscii) ) }
Java
NdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")), new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
سيظهر فلتر الأهداف لسجلّ NDEF السابق على النحو التالي:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example.android.beam" /> </intent-filter>
TNF_WELL_KNOWN مع RTD_TEXT
يمكنك إنشاء سجلّ NDEF TNF_WELL_KNOWN
بالطريقة التالية:
Kotlin
fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord { val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII")) val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16") val textBytes = payload.toByteArray(utfEncoding) val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7 val status = (utfBit + langBytes.size).toChar() val data = ByteArray(1 + langBytes.size + textBytes.size) data[0] = status.toByte() System.arraycopy(langBytes, 0, data, 1, langBytes.size) System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size) return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data) }
Java
public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) { byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16"); byte[] textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); return record; }
سيظهر فلتر الأهداف لسجلّ NDEF السابق على النحو التالي:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
TNF_WELL_KNOWN مع RTD_URI
يمكنك إنشاء سجلّ NDEF TNF_WELL_KNOWN
بالطرق التالية:
باستخدام الطريقة createUri(String)
:
Kotlin
val rtdUriRecord1 = NdefRecord.createUri("https://example.com")
Java
NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");
باستخدام الطريقة createUri(Uri)
:
Kotlin
val rtdUriRecord2 = Uri.parse("https://example.com").let { uri -> NdefRecord.createUri(uri) }
Java
Uri uri = Uri.parse("https://example.com"); NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
إنشاء NdefRecord
يدويًا:
Kotlin
val uriField = "example.com".toByteArray(Charset.forName("US-ASCII")) val payload = ByteArray(uriField.size + 1) //add 1 for the URI Prefix payload [0] = 0x01 //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.size) //appends URI to payload val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload)
Java
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII")); byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix payload[0] = 0x01; //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload NdefRecord rtdUriRecord = new NdefRecord( NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
سيظهر فلتر الأهداف لسجلّ NDEF السابق على النحو التالي:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="example.com" android:pathPrefix="" /> </intent-filter>
نوع TNF_EXTERNAL_TYPE
يمكنك إنشاء سجلّ NDEF TNF_EXTERNAL_TYPE
في ما يلي
الطرق:
باستخدام الطريقة createExternal()
:
Kotlin
var payload: ByteArray //assign to your data val domain = "com.example" //usually your app's package name val type = "externalType" val extRecord = NdefRecord.createExternal(domain, type, payload)
Java
byte[] payload; //assign to your data String domain = "com.example"; //usually your app's package name String type = "externalType"; NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);
إنشاء NdefRecord
يدويًا:
Kotlin
var payload: ByteArray ... val extRecord = NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".toByteArray(Charset.forName("US-ASCII")), ByteArray(0), payload )
Java
byte[] payload; ... NdefRecord extRecord = new NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")), new byte[0], payload);
سيظهر فلتر الأهداف لسجلّ NDEF السابق على النحو التالي:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="vnd.android.nfc" android:host="ext" android:pathPrefix="/com.example:externalType"/> </intent-filter>
استخدام TNF_EXTERNAL_TYPE
لإجراء عمليات نشر أكثر عمومية لعلامات NFC بهدف توفير الدعم لكليهما بشكل أفضل
الأجهزة التي تعمل بنظام التشغيل Android وتلك التي لا تعمل بنظام التشغيل Android.
ملاحظة: تحتوي أرقام URN للنطاق TNF_EXTERNAL_TYPE
على تنسيق أساسي لما يلي:
urn:nfc:ext:example.com:externalType
، مع ذلك، لا يمكن العثور على مواصفات تقنية "الوقت الفعلي للتكرار" في منتدى الاتصال القصير المدى (NFC)
يعلن ضرورة حذف الجزء urn:nfc:ext:
من رقم تعريف المستخدم في URN من
سجلّ NDEF. لذا، كل ما عليك فعله هو توفير النطاق (example.com
في المثال).
والنوع (externalType
في المثال) مفصولاً بنقطتين.
عند إرسال TNF_EXTERNAL_TYPE
، يحوِّل Android رقم URN urn:nfc:ext:example.com:externalType
إلى معرّف الموارد المنتظم (URI) لـ vnd.android.nfc://ext/example.com:externalType
، وهو ما
يوضِّح فلتر الأهداف في المثال البيانات.
سجلّات تطبيقات Android
تم طرح سجل تطبيقات Android (AAR) في إصدار Android 4.0 (المستوى 14 من واجهة برمجة التطبيقات)، وهو يوفر أن التطبيق يبدأ عند مسح علامة NFC ضوئيًا. يحتوي AAR على اسم الحزمة من تطبيق مضمّن في سجل NDEF. يمكنك إضافة ملف AAR إلى أي سجلّ NDEF الخاص بـ NDEF. نظرًا لأن Android يبحث في رسالة NDEF بالكامل عن AAR. وفي حال العثور على تقنية AAR، فإنها تبدأ التطبيق بناءً على اسم الحزمة داخل AAR. إذا لم يكن التطبيق متاحًا على جهازك، تمّ إطلاق Google Play لتنزيل التطبيق.
تُعد AAR مفيدة إذا كنت تريد منع التطبيقات الأخرى من التصفية للحصول على نفس الغرض من المحتمل معالجة علامات محددة نشرتها لا تتوفّر الاقتراحات المطبّقة تلقائيًا إلا في مستوى التطبيق، بسبب قيد اسم الحزمة، وليس على مستوى النشاط كما هو الحال مع فلترة الأهداف إذا كنت تريد التعامل مع هدف على مستوى النشاط، يمكنك استخدام فلاتر الأهداف.
إذا كانت العلامة تحتوي على محتوى AAR، يتم إرسال نظام إرسال العلامات بالطريقة التالية:
- حاول بدء نشاط باستخدام فلتر الأهداف كالمعتاد. إذا كان النشاط الذي يطابق يتطابق الغرض أيضًا مع AAR، ابدأ النشاط.
- إذا كان النشاط الذي تتم فلترته للغرض لا يتطابق مع AAR، إذا كان بإمكان "أنشطة متعددة" معالجة الغرض من هذه الميزة، أو إذا لم يتم معالجة الغرض من أي "نشاط"، يمكنك بدء التطبيق المحدد في AAR.
- في حال عدم تمكُّن أي تطبيق من تشغيل AAR، انتقِل إلى Google Play لتنزيل يستند إلى AAR.
ملاحظة: يمكنك إلغاء الاقتراحات المطبّقة تلقائيًا (AAR) ونظام إرسال الأهداف باستخدام الواجهة نظام إرسال، ما يمنح الأولوية للنشاط الذي تعمل في المقدّمة عندما تكون علامة NFC من اكتشاف. ومن خلال هذه الطريقة، يجب أن يكون النشاط في المقدّمة لإلغاء AAR نظام إرسال الأهداف.
إذا كنت لا تزال تريد الفلترة بحثًا عن العلامات الممسوحة ضوئيًا والتي لا تحتوي على محتوى AAR، يمكنك الإفصاح عن ذلك فلاتر الأهداف كالمعتاد. ويكون هذا الإجراء مفيدًا إذا كان التطبيق مهتمًا بالعلامات الأخرى. التي لا تحتوي على AAR. على سبيل المثال، ربما تريد ضمان معالجة تطبيقك التي تنشرها، بالإضافة إلى العلامات العامة التي تنشرها جهات خارجية. ملاحظات يجب أخذها في الاعتبار أن التطبيقات المعتمِدة تلقائيًا على الأجهزة تقتصر على الأجهزة التي تعمل بالإصدار 4.0 من نظام التشغيل Android أو الإصدارات الأحدث، لذا يجب على الأرجح عند نشر العلامات لاستخدام مزيج من أنواع AAR وMIME/معرّفات موارد منتظمة (URI) للتوافق مع أوسع مجموعة من الأجهزة. ضِمن بالإضافة إلى ذلك، عند نشر علامات NFC، فكّر في طريقة كتابة علامات NFC لتفعيل هذه الميزة دعم لمعظم الأجهزة (التي تعمل بنظام التشغيل Android وغيرها من الأجهزة). يمكنك القيام بذلك عن طريق تحديد نوع MIME أو معرّف موارد منتظم (URI) فريد نسبيًا ما يسهِّل على التطبيقات التمييز بينها.
ويوفر Android واجهة برمجة تطبيقات بسيطة لإنشاء الاقتراحات المطبّقة تلقائيًا
createApplicationRecord()
كل ما عليك
فعلها هو تضمين AAR في أي مكان في NdefMessage
. لا تريد
لاستخدام السجل الأول من NdefMessage
، ما لم يكن AAR هو السجل الوحيد
في NdefMessage
. وهذا لأن نظام Android
يتحقق النظام من أول سجل لـ NdefMessage
لتحديد نوع MIME أو
معرّف الموارد المنتظم (URI) للعلامة، والذي يُستخدم لإنشاء هدف يمكن للتطبيقات فلترته. يُنشئ الكود التالي
كيفية إنشاء AAR:
Kotlin
val msg = NdefMessage( arrayOf( ..., NdefRecord.createApplicationRecord("com.example.android.beam") ) )
Java
NdefMessage msg = new NdefMessage( new NdefRecord[] { ..., NdefRecord.createApplicationRecord("com.example.android.beam")} ); )
إرسال رسائل NDEF إلى الأجهزة الأخرى
يتيح شعاع Android تبادل البيانات البسيطة من نظير إلى نظير بين جهازين يعملان بنظام التشغيل Android. تشير رسالة الأشكال البيانية إذا أراد التطبيق إرسال البيانات إلى جهاز آخر، يجب أن يكون في المقدّمة وأن يكون الجهاز ينبغي ألا يكون تلقي البيانات مُقفَلاً. عندما يقترب الجهاز المشتعل من مكان قريب بما فيه الكفاية جهاز الاستقبال، يعرض الجهاز المشيع "النقر للشعاع" واجهة مستخدم يمكن للمستخدم بعد ذلك اختيار ما إذا كان سيتم إرسال الرسالة إلى الجهاز المستلم أم لا.
ملاحظة: كان إرسال واجهة NDEF الأمامية متاحًا في المستوى 10 من واجهة برمجة التطبيقات،
التي توفر وظائف مماثلة لشعاع Android. ومنذ ذلك الحين، تم إيقاف واجهات برمجة التطبيقات هذه نهائيًا، ولكن
متاحة لدعم الأجهزة القديمة. يُرجى الاطّلاع على enableForegroundNdefPush()
للحصول على المزيد من المعلومات.
يمكنك تمكين شعاع Android لتطبيقك من خلال استدعاء إحدى الطريقتين التاليتين:
setNdefPushMessage()
: يقبلNdefMessage
لضبطه كرسالة للإرسال. إرسال الرسالة تلقائيًا عندما يكون جهازان قريبين بدرجة كافيةsetNdefPushMessageCallback()
: تقبل معاودة الاتصال التي تحتوي علىcreateNdefMessage()
وهو ما يتم طلبه عندما يكون الجهاز في النطاق لإرسال البيانات إليه. تتيح لك معاودة الاتصال إنشاء رسالة NDEF عند الضرورة فقط.
يمكن للنشاط إرسال رسالة NDEF واحدة فقط في كل مرة، وبالتالي تكون الأولوية لـ setNdefPushMessageCallback()
.
أكثر من setNdefPushMessage()
في حال ضبطهما معًا. للاستخدام
يجب استيفاء الإرشادات العامة التالية:
- يجب أن يكون النشاط الذي يرسِل البيانات في المقدّمة. يجب أن يتوفر في كلا الجهازين فتح قفل شاشاتهم.
- يجب تغليف البيانات التي ترسلها في إطار
NdefMessage
. الخاص بك. - يجب أن يتيح جهاز NFC الذي يتلقى البيانات المُرسلة
com.android.npp
بروتوكول الدفع NDEF أو SNEP في منتدى NFC Community (تبادل NDEF البسيط) البروتوكول). يجب استخدام بروتوكولcom.android.npp
للأجهزة ذات المستوى 9 من واجهة برمجة التطبيقات (نظام التشغيل Android). 2.3) إلى المستوى 13 من واجهة برمجة التطبيقات (Android 3.2). يجب إدخالcom.android.npp
وSNEP على المستوى 14 من واجهة برمجة التطبيقات (الإصدار 4.0 من نظام التشغيل Android) والإصدارات الأحدث
ملاحظة: إذا كان نشاطك يعمل على تفعيل شعاع Android وكان في المقدّمة، يكون نظام إرسال الأهداف العادي غير مفعَّل. ومع ذلك، إذا كان نشاطك أيضًا يمكّن إرسال البيانات في المقدّمة، يظلّ بإمكانها فحص العلامات التي تتطابق مع فلاتر الأهداف التي تم ضبطها في إرسال المقدمة.
لتمكين شعاع Android:
- إنشاء
NdefMessage
يحتوي علىNdefRecord
تريد الضغط عليه على الجهاز الآخر. - يمكنك استدعاء الدالة
setNdefPushMessage()
باستخدامNdefMessage
أو طلبsetNdefPushMessageCallback
الذي يتم تمريره في كائنNfcAdapter.CreateNdefMessageCallback
بطريقةonCreate()
. نشاطك. تتطلّب هذه الطرق نشاطًا واحدًا على الأقل تريد تفعيله على Android. شعاع، بالإضافة إلى قائمة اختيارية من الأنشطة الأخرى التي ينبغي تنشيطهابشكلٍ عام، يتم استخدام
setNdefPushMessage()
عادةً إذا كان سجلّ "نشاطك" يحتاج فقط إلى: دفع رسالة NDEF نفسها في جميع الأوقات، عندما يكون هناك جهازان في النطاق للاتصال. أنت تستخدمsetNdefPushMessageCallback
عندما يهتم هذا التطبيق بالسياق الحالي للتطبيق ويريد عرض رسالة NDEF اعتمادًا على ما يفعله المستخدم في التطبيق.
يوضح النموذج التالي كيف يستدعي نشاط بسيط NfcAdapter.CreateNdefMessageCallback
في طريقة onCreate()
النشاط (راجِع AndroidBeamDemo
للعينة الكاملة). يتضمن هذا المثال أيضًا طرقًا لمساعدتك في إنشاء سجلّ MIME:
Kotlin
package com.example.android.beam import android.app.Activity import android.content.Intent import android.nfc.NdefMessage import android.nfc.NdefRecord import android.nfc.NfcAdapter import android.nfc.NfcAdapter.CreateNdefMessageCallback import android.nfc.NfcEvent import android.os.Bundle import android.os.Parcelable import android.widget.TextView import android.widget.Toast import java.nio.charset.Charset class Beam : Activity(), NfcAdapter.CreateNdefMessageCallback { private var nfcAdapter: NfcAdapter? = null private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) textView = findViewById(R.id.textView) // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this) if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show() finish() return } // Register callback nfcAdapter?.setNdefPushMessageCallback(this, this) } override fun createNdefMessage(event: NfcEvent): NdefMessage { val text = "Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis() return NdefMessage( arrayOf( createMime("application/vnd.com.example.android.beam", text.toByteArray()) ) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. *///,NdefRecord.createApplicationRecord("com.example.android.beam") ) } override fun onResume() { super.onResume() // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { processIntent(intent) } } override fun onNewIntent(intent: Intent) { // onResume gets called after this to handle the intent setIntent(intent) } /** * Parses the NDEF Message from the intent and prints to the TextView */ private fun processIntent(intent: Intent) { textView = findViewById(R.id.textView) // only one message sent during the beam intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMsgs -> (rawMsgs[0] as NdefMessage).apply { // record 0 contains the MIME type, record 1 is the AAR, if present textView.text = String(records[0].payload) } } } }
Java
package com.example.android.beam; import android.app.Activity; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; import android.nfc.NfcEvent; import android.os.Bundle; import android.os.Parcelable; import android.widget.TextView; import android.widget.Toast; import java.nio.charset.Charset; public class Beam extends Activity implements CreateNdefMessageCallback { NfcAdapter nfcAdapter; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show(); finish(); return; } // Register callback nfcAdapter.setNdefPushMessageCallback(this, this); } @Override public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis()); NdefMessage msg = new NdefMessage( new NdefRecord[] { createMime( "application/vnd.com.example.android.beam", text.getBytes()) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. */ //,NdefRecord.createApplicationRecord("com.example.android.beam") }); return msg; } @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { textView = (TextView) findViewById(R.id.textView); Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present textView.setText(new String(msg.getRecords()[0].getPayload())); } }
يُرجى العِلم أنّ هذا الرمز البرمجي يعلّق على AAR، ويمكنك إزالته. في حال تفعيل AAR، سيتم التطبيق المحدد في ميزة "التطبيق التلقائي للاقتراحات" دائمًا ما يتلقّى رسالة "شعاع Android". إذا لم يكن التطبيق حاليًا، بدأ Google Play في تنزيل التطبيق. ومن ثم، فإن الهدف التالي لا يكون الفلتر ضروريًا من الناحية الفنية للأجهزة التي تعمل بالإصدار 4.0 من نظام التشغيل Android أو الإصدارات الأحدث في حال استخدام ميزة "الاقتراحات المطبّقة تلقائيًا":
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.com.example.android.beam"/> </intent-filter>
باستخدام فلتر الأهداف هذا، يمكن الآن بدء تشغيل تطبيق "com.example.android.beam
".
عند مسح علامة NFC أو تلقي شعاع Android مع AAR
النوع com.example.android.beam
، أو عندما تحتوي رسالة بتنسيق NDEF على سجل MIME
من النوع application/vnd.com.example.android.beam
.
ومع أنّ ميزة "الاقتراحات المطبّقة تلقائيًا" تضمن بدء تشغيل التطبيق أو تنزيله، لا يتم تضمين فلاتر الأهداف. الموصى بها، لأنها تتيح لك بدء نشاط من اختيارك في بدلاً من بدء النشاط الرئيسي دائمًا ضمن الحزمة التي يحددها AAR. لا تتضمّن AAR دقة مستوى النشاط. ولأنّ بعض الأجهزة التي تعمل بنظام التشغيل Android لا تدعم AAR، يجب أيضًا تضمين معلومات تعريفية في أول سجل NDEF الخاص بـ NDEF الرسائل والتصفية لذلك أيضًا، من باب الاحتياط. راجع إنشاء مشترك أنواع سجلات NDEF لمزيد من المعلومات حول كيفية إنشاء السجلات