أساسيات تقنية NFC

يصف هذا المستند مهام 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 وتحلِّلها وتحاول تحديد مكان التطبيقات المهتمة بالبيانات الممسوحة ضوئيًا. أُنشأها جون هنتر، الذي كان متخصصًا عن طريق:

  1. تحليل علامة NFC ومعرفة نوع MIME أو معرف موارد منتظم (URI) لتحديد حمولة البيانات في العلامة.
  2. تغليف نوع MIME أو معرّف الموارد المنتظم (URI) والحمولة في غرض هذان أول اثنان في كيفية تعيين علامات NFC لأنواع MIME ومعرّفات الموارد المنتظمة (URI).
  3. يؤدي هذا الخيار إلى بدء نشاط استنادًا إلى هدفه. يتم وصف ذلك في كيفية نقل علامات 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 معلومات تعريفية، فإنها تُرسل الغرض إلى تطبيق مهتم فلاتر للأهداف إذا كان بإمكان أكثر من تطبيق واحد معالجة الغرض، فإن منتقي النشاط حتى يتمكن المستخدم من اختيار النشاط. يحدد نظام إرسال العلامات ثلاثة أغراض، يتم سردها بالترتيب من أعلى إلى أدنى أولوية:

  1. ACTION_NDEF_DISCOVERED: يُستخدَم هذا الغرض لبدء نشاط يتم فحصه عند مسح علامة تحتوي على حمولة NDEF وتكون من نوع معروف. هذا هو النية ذات الأولوية القصوى، ويحاول نظام إرسال العلامات بدء نشاط بهذا الشكل النية قبل أي نية أخرى، كلما أمكن ذلك.
  2. ACTION_TECH_DISCOVERED: في حال عدم تسجيل أي أنشطة في التعامل مع ACTION_NDEF_DISCOVERED يحاول نظام إرسال العلامات بدء تطبيق بهذا الغرض. هذا النمط تبدأ intent أيضًا مباشرةً (بدون بدء ACTION_NDEF_DISCOVERED أولاً) إذا كانت العلامة التي يتم مسحها ضوئيًا يحتوي على بيانات NDEF لا يمكن ربطها بنوع MIME أو معرف موارد منتظم (URI)، أو إذا كانت العلامة لا تحتوي على NDEF البيانات ولكنه من تقنية علامة معروفة.
  3. ACTION_TAG_DISCOVERED: تم بدء هذا الغرض. في حال عدم توفّر أنشطة تعالج ACTION_NDEF_DISCOVERED أو ACTION_TECH_DISCOVERED الأهداف.

في ما يلي الطريقة الأساسية التي يعمل بها نظام إرسال العلامات:

  1. جرِّب بدء نشاط بهدف أنشأه نظام إرسال العلامات. عند تحليل علامة NFC (إما ACTION_NDEF_DISCOVERED أو ACTION_TECH_DISCOVERED).
  2. في حال عدم توفّر أنشطة للفلترة وفقًا لهذا القصد، جرِّب بدء النشاط بالنوع التالي. الغرض الأدنى من الأولوية (إما ACTION_TECH_DISCOVERED أو ACTION_TAG_DISCOVERED) إلى أن تتم فلترة أحد التطبيقات حسب النية أو إلى أن يجرِّب نظام إرسال العلامات جميع الأهداف الممكنة.
  3. وفي حال عدم فلترة أي تطبيقات بحثًا عن أي من الأهداف، لا تتخذ أي إجراء.
الشكل 1. نظام إرسال العلامات

استخدِم، كلما أمكن، مع رسائل 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، يتم إرسال نظام إرسال العلامات بالطريقة التالية:

  1. حاول بدء نشاط باستخدام فلتر الأهداف كالمعتاد. إذا كان النشاط الذي يطابق يتطابق الغرض أيضًا مع AAR، ابدأ النشاط.
  2. إذا كان النشاط الذي تتم فلترته للغرض لا يتطابق مع AAR، إذا كان بإمكان "أنشطة متعددة" معالجة الغرض من هذه الميزة، أو إذا لم يتم معالجة الغرض من أي "نشاط"، يمكنك بدء التطبيق المحدد في AAR.
  3. في حال عدم تمكُّن أي تطبيق من تشغيل 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:

  1. إنشاء NdefMessage يحتوي على NdefRecord تريد الضغط عليه على الجهاز الآخر.
  2. يمكنك استدعاء الدالة 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 لمزيد من المعلومات حول كيفية إنشاء السجلات