ข้อมูลพื้นฐานเกี่ยวกับ NFC

เอกสารนี้อธิบายงานพื้นฐานของ NFC ที่คุณทำใน Android ซึ่งจะอธิบายวิธีส่งและ รับข้อมูล NFC ในรูปแบบข้อความ NDEF และอธิบายเกี่ยวกับ API เฟรมเวิร์ก Android ที่รองรับ ฟีเจอร์เหล่านี้ สำหรับหัวข้อขั้นสูง รวมถึงการสนทนาเกี่ยวกับการทำงานกับข้อมูลที่ไม่ใช่ NDEF โปรดดู NFC ขั้นสูง

กรณีการใช้งานหลัก 2 กรณีเมื่อทำงานกับข้อมูล NDEF และ Android ได้แก่

  • การอ่านข้อมูล NDEF จากแท็ก NFC
  • การบีมข้อความ NDEF จากอุปกรณ์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งด้วย Android บีม TM

การอ่านข้อมูล NDEF จากแท็ก NFC ได้รับการจัดการด้วยการจ่ายแท็ก ซึ่งจะวิเคราะห์แท็ก NFC ที่พบ จัดหมวดหมู่ข้อมูลอย่างเหมาะสม และเริ่ม แอปพลิเคชันที่สนใจข้อมูลที่จัดหมวดหมู่ แอปพลิเคชันที่ต้องการจัดการ แท็ก NFC ที่สแกนสามารถประกาศตัวกรอง Intent และ ขอให้จัดการข้อมูล

ฟีเจอร์ Android BeamTM ช่วยให้อุปกรณ์พุชข้อความ NDEF ไปยัง อุปกรณ์อื่นโดยแตะอุปกรณ์พร้อมกัน การโต้ตอบนี้ทำให้คุณ เพื่อส่งข้อมูลมากกว่าเทคโนโลยีไร้สายอื่นๆ เช่น บลูทูธ เพราะเมื่อใช้ NFC จะไม่มีอุปกรณ์ที่ใช้ด้วยตนเอง ต้องมีการค้นพบหรือการจับคู่ การเชื่อมต่อจะเริ่มต้นโดยอัตโนมัติเมื่อมีอุปกรณ์ 2 เครื่องมา ให้อยู่ในช่วงที่กำหนด Androidบีมพร้อมใช้งานผ่านชุด API ของ NFC ดังนั้นแอปพลิเคชันใดๆ ก็รับส่งข้อมูลได้ ข้อมูลระหว่างอุปกรณ์ ตัวอย่างเช่น แอปพลิเคชันรายชื่อติดต่อ เบราว์เซอร์ และ YouTube ใช้ Android Beam เพื่อแบ่งปันรายชื่อติดต่อ หน้าเว็บ และวิดีโอกับอุปกรณ์อื่นๆ

ระบบการจ่ายแท็ก

อุปกรณ์ที่ใช้ Android มักจะมองหาแท็ก NFC เมื่อหน้าจอ ถูกปลดล็อก เว้นแต่ว่าจะปิดใช้งาน NFC ในเมนู "การตั้งค่า" ของอุปกรณ์ เมื่ออุปกรณ์ที่ใช้ระบบ Android พบแท็ก NFC การทำงานที่ต้องการ คือการให้กิจกรรมที่เหมาะสมที่สุดจัดการกับ Intent โดยไม่ต้องถามผู้ใช้ว่าแอปพลิเคชันใด ในการใช้กัน เนื่องจากอุปกรณ์จะสแกนแท็ก NFC ในระยะที่สั้นมาก จึงมีแนวโน้มว่าผู้ใช้จะสแกนแท็ก เลือกกิจกรรมที่จะบังคับให้ย้ายอุปกรณ์ออกจากแท็กและหยุดการเชื่อมต่อ คุณควรพัฒนากิจกรรมให้จัดการเฉพาะแท็ก NFC ที่กิจกรรมของคุณสนใจเท่านั้น ป้องกันไม่ให้ตัวเลือกกิจกรรมปรากฏขึ้น

Android มีระบบมอบหมายแท็กแบบพิเศษที่วิเคราะห์ผลที่สแกนเพื่อช่วยให้คุณบรรลุเป้าหมายนี้ แท็ก NFC จะแยกวิเคราะห์และพยายามค้นหาแอปพลิเคชันที่สนใจข้อมูลที่สแกน ทั้งนี้ ซึ่งทำโดย:

  1. แยกวิเคราะห์แท็ก NFC และหาประเภท MIME หรือ URI ที่ระบุเพย์โหลดข้อมูล ในแท็ก
  2. การห่อหุ้มประเภท MIME หรือ URI และเพย์โหลดลงใน Intent 2 รายการแรกนี้ เราได้อธิบายขั้นตอนไว้ในวิธีที่แท็ก NFC จับคู่กับประเภท MIME และ URI
  3. เริ่มกิจกรรมตามความตั้งใจ ซึ่งอธิบายไว้ใน วิธีการส่งแท็ก NFC ไปยังแอปพลิเคชัน

วิธีที่แท็ก NFC แมปกับประเภทและ URI ของ MIME

ก่อนที่จะเริ่มเขียนแอปพลิเคชัน NFC คุณควรทำความเข้าใจเกี่ยวกับ ประเภทแท็ก NFC, วิธีที่ระบบส่งแท็กแยกวิเคราะห์แท็ก NFC และงานพิเศษที่แท็ก ระบบการจ่ายงานจะทำเมื่อตรวจพบข้อความ NDEF แท็ก NFC จะอยู่ใน เทคโนโลยีต่างๆ มากมาย และยังสามารถเขียนข้อมูล ลงในระบบต่างๆ ได้หลากหลายวิธี Android มีการรองรับมาตรฐาน NDEF มากที่สุดซึ่งกำหนดโดยฟอรัม NFC

ข้อมูล NDEF รวมอยู่ในข้อความ (NdefMessage) ซึ่งมี ระเบียนขึ้นไป (NdefRecord) ระเบียน NDEF แต่ละรายการต้องมีรูปแบบที่ถูกต้องตาม ข้อกำหนดของประเภทระเบียนที่คุณต้องการสร้าง แอนดรอยด์ ยังสนับสนุนแท็กประเภทอื่นๆ ที่ไม่มีข้อมูล 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 ให้ใช้ ฟิลด์นี้เพื่อระบุ Record Type Definition (RTD) ค่า RTD ที่ถูกต้องจะอธิบายไว้ในตาราง 2
รหัสความยาวตัวแปร
ตัวระบุที่ไม่ซ้ำกันสำหรับระเบียน ช่องนี้มีการใช้งานไม่บ่อยนัก หากจำเป็นต้องระบุแท็กที่ไม่ซ้ำ คุณสามารถสร้างรหัสสำหรับแท็กนั้นได้
เพย์โหลดที่มีความยาวแปรผัน
เพย์โหลดข้อมูลจริงที่คุณต้องการอ่านหรือเขียน NDEF ข้อความอาจมีระเบียน NDEF ได้หลายรายการ ดังนั้นอย่าคิดว่าเพย์โหลดทั้งหมดอยู่ใน NDEF แรก ของข้อความ NDEF

ระบบมอบหมายแท็กใช้ช่อง TNF และประเภทเพื่อพยายามแมปประเภท MIME หรือ URI กับ ข้อความ NDEF หากสำเร็จ ระบบจะสรุปข้อมูลดังกล่าวไว้ใน Intent ACTION_NDEF_DISCOVERED พร้อมกับเพย์โหลดจริง อย่างไรก็ตาม คือกรณีที่ระบบมอบหมายแท็กไม่สามารถระบุประเภทข้อมูลโดยอิงตาม NDEF แรก บันทึก กรณีนี้จะเกิดขึ้นเมื่อข้อมูล NDEF จับคู่กับประเภทหรือ URI ไม่ได้ หรือเมื่อ แท็ก NFC ไม่มีข้อมูล NDEF ตั้งแต่แรก ในกรณีดังกล่าว ออบเจ็กต์ Tag ที่มีข้อมูลเกี่ยวกับเทคโนโลยีของแท็กและเพย์โหลดจะ ห่อหุ้มไว้ใน Intent ของ ACTION_TECH_DISCOVERED แทน

ตาราง 1 อธิบายวิธีที่ระบบมอบหมายแท็กจับคู่ TNF และประเภท เป็นประเภท MIME หรือ URI นอกจากนี้ยังอธิบายว่า TNF ใดที่แมปกับประเภทหรือ URI ไม่ได้ ในกรณีเหล่านี้ ระบบการจ่ายแท็กจะกลับไปใช้ ACTION_TECH_DISCOVERED

ตัวอย่างเช่น หากระบบจ่ายแท็กพบระเบียนประเภท TNF_ABSOLUTE_URI ระบบจะจับคู่ช่องประเภทความยาวตัวแปรของระเบียนนั้น ไปยัง URI ระบบการจ่ายแท็กจะสรุป URI ดังกล่าวในช่องข้อมูลของ Intent ACTION_NDEF_DISCOVERED รวมกับข้อมูลอื่นๆ เกี่ยวกับแท็ก เช่น เพย์โหลด ในทางกลับกัน หากตรวจพบระเบียนประเภท TNF_UNKNOWN ก็จะสร้าง Intent ที่สรุปเทคโนโลยีของแท็ก แทน

ตาราง 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 ขึ้นอยู่กับ Record Type Definition (RTD) ซึ่งคุณตั้งค่าใน ฟิลด์ประเภท โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับตาราง 2 RTD ที่พร้อมใช้งานและการแมป

ตาราง 2 RTD ที่รองรับสำหรับ 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 ส่งไปยังแอปพลิเคชัน

เมื่อระบบมอบหมายแท็กเสร็จแล้ว ให้สร้าง Intent ที่สรุปแท็ก NFC และแท็ก NFC ข้อมูลที่ระบุตัวตนได้ โมเดลจะส่งความตั้งใจไปยังแอปพลิเคชันที่สนใจ สำหรับ Intent หากมีแอปพลิเคชันมากกว่า 1 รายการที่จัดการความตั้งใจได้ ตัวเลือกกิจกรรม จะปรากฏขึ้น เพื่อให้ผู้ใช้สามารถเลือกกิจกรรม ระบบมอบหมายแท็กจะกำหนด Intent 3 อย่าง ซึ่งจะเรียงตามลำดับความสำคัญสูงสุดไปหาต่ำสุด ดังนี้

  1. ACTION_NDEF_DISCOVERED: Intent นี้ใช้เพื่อเริ่มต้น การทำงานเมื่อสแกนแท็กที่มีเพย์โหลด NDEF และเป็นประเภทที่รู้จัก นี่คือ ความตั้งใจที่มีลำดับความสำคัญสูงสุด และระบบจ่ายแท็กจะพยายามเริ่มกิจกรรมด้วย ก่อนความตั้งใจอื่นๆ เมื่อเป็นไปได้
  2. ACTION_TECH_DISCOVERED: หากไม่มีกิจกรรมใดลงทะเบียน จัดการACTION_NDEF_DISCOVERED ระบบการจ่ายแท็กจะพยายามเริ่มต้นแอปพลิเคชันด้วย Intent นี้ ช่วงเวลานี้ Intent จะเริ่มต้นโดยตรงด้วย (โดยไม่ต้องเริ่ม ACTION_NDEF_DISCOVERED ก่อน) หากแท็กที่สแกน มีข้อมูล NDEF ที่จับคู่กับประเภท MIME หรือ URI ไม่ได้ หรือหากแท็กไม่มี NDEF แต่เป็นเทคโนโลยีแท็กที่รู้จัก
  3. ACTION_TAG_DISCOVERED: Intent นี้เริ่มขึ้นแล้ว หากไม่มีกิจกรรมที่เกี่ยวข้องกับACTION_NDEF_DISCOVEREDหรือACTION_TECH_DISCOVERED Intent

วิธีการทำงานของระบบส่งแท็กแบบพื้นฐานมีดังนี้

  1. ลองเริ่มกิจกรรมด้วย Intent ที่สร้างขึ้นโดยระบบการจ่ายแท็ก เมื่อแยกวิเคราะห์แท็ก NFC ( ACTION_NDEF_DISCOVERED หรือ ACTION_TECH_DISCOVERED)
  2. หากไม่มีตัวกรองกิจกรรมสำหรับความตั้งใจนั้น ให้ลองเริ่มกิจกรรมด้วย Intent ที่มีลำดับความสำคัญต่ำสุด (ACTION_TECH_DISCOVERED หรือ ACTION_TAG_DISCOVERED) จนกว่าแอปพลิเคชันจะกรอง ของความตั้งใจหรือจนกว่าระบบการจ่ายแท็กจะพยายามทำ Intent ที่เป็นไปได้ทั้งหมด
  3. หากไม่มีแอปพลิเคชันกรอง Intent ใด ก็ไม่ต้องดำเนินการใดๆ
รูปที่ 1 ระบบการจ่ายงานแท็ก

หากเป็นไปได้ ให้ทำงานกับข้อความ NDEF และ Intent ACTION_NDEF_DISCOVERED เนื่องจากมีความเฉพาะเจาะจงมากที่สุด ทั้ง 3 อย่าง จุดประสงค์นี้ช่วยให้คุณเริ่มการสมัครในเวลาที่เหมาะสมกว่า อีก 2 เป้าหมาย ทำให้ผู้ใช้ได้รับประสบการณ์ที่ดีขึ้น

ขอสิทธิ์เข้าถึง NFC ในไฟล์ Manifest ของ Android

ก่อนที่คุณจะสามารถเข้าถึงฮาร์ดแวร์ NFC ของอุปกรณ์และจัดการ Intent ของ NFC ได้อย่างเหมาะสม ให้ประกาศสิ่งต่อไปนี้ รายการในไฟล์ AndroidManifest.xml

  • องค์ประกอบ NFC <uses-permission> สำหรับเข้าถึงฮาร์ดแวร์ NFC:
    <uses-permission android:name="android.permission.NFC" />
    
  • เวอร์ชัน SDK ขั้นต่ำที่แอปพลิเคชันของคุณรองรับได้ API ระดับ 9 รองรับเฉพาะ ส่งแท็กผ่าน ACTION_TAG_DISCOVERED แบบจำกัด และให้ สิทธิ์เข้าถึงข้อความ NDEF ผ่าน EXTRA_NDEF_MESSAGES ส่วนเกิน ยังไม่ได้ติดต่อ เข้าถึงพร็อพเพอร์ตี้แท็กหรือการดำเนินการ I/O อื่นๆ ได้ API ระดับ 10 รองรับผู้อ่าน/ผู้เขียนอย่างครอบคลุม รวมถึงการพุช NDEF ในเบื้องหน้าและระดับ API 14 ทำให้พุชข้อความ NDEF ไปยังอุปกรณ์อื่นๆ ได้ง่ายขึ้นด้วย Android Beam และส่วนเสริมเพิ่มเติม ในการสร้างระเบียน 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

ตัวกรองสำหรับ Intent ของ NFC

หากต้องการเริ่มแอปพลิเคชันของคุณเมื่อมีการสแกนแท็ก NFC ที่คุณต้องการจัดการ แอปพลิเคชันของคุณ คุณจะกรอง Intent ของ NFC แบบ 1, 2 หรือทั้ง 3 รายการในไฟล์ Manifest ของ Android ได้ อย่างไรก็ตาม คุณ มักจะต้องการกรอง Intent ACTION_NDEF_DISCOVERED ของ ควบคุมเวลาที่แอปพลิเคชันของคุณจะเริ่มต้นได้มากที่สุด Intent 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 เป็นเพียงทางเลือกสุดท้ายเท่านั้น สำหรับแอปพลิเคชันที่จะกรองในกรณีที่ไม่มีการติดตั้งแอปพลิเคชันอื่นๆ เพื่อจัดการ Intent ACTION_NDEF_DISCOVERED หรือ ACTION_TECH_DISCOVERED

เนื่องจากการติดตั้งใช้งานแท็ก NFC จะแตกต่างกันไปและหลายครั้งก็ไม่ได้อยู่ภายใต้การควบคุมของคุณ จึงมักไม่เป็นเช่นนั้น ก็เป็นไปได้ นี่คือเหตุผลที่คุณสามารถเลือกใช้ Intent อีก 2 รายการได้เมื่อจำเป็น เมื่อคุณมี ควบคุมประเภทของแท็กและข้อมูลที่เขียนได้ ขอแนะนำให้ใช้ NDEF เพื่อจัดรูปแบบ แท็กทั้งหมด. ส่วนต่อไปนี้อธิบายวิธีกรองความตั้งใจแต่ละประเภท

พบการดำเนินการแล้ว

หากต้องการกรอง Intent ACTION_NDEF_DISCOVERED ให้ประกาศ ตัวกรอง Intent พร้อมกับประเภทข้อมูลที่คุณต้องการกรอง ตัวกรองตัวอย่างต่อไปนี้สำหรับ ACTION_NDEF_DISCOVERED Intent ที่มีประเภท 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>

ค้นพบแล้ว

หากกิจกรรมกรอง Intent ACTION_TECH_DISCOVERED คุณต้องสร้างไฟล์ทรัพยากร XML ที่ระบุเทคโนโลยีที่กิจกรรมของคุณรองรับ ภายในกลุ่ม tech-list กิจกรรมของคุณ จะถือว่าตรงกันหากชุด tech-list เป็นชุดย่อยของเทคโนโลยีที่ แท็กที่รองรับ ซึ่งดูได้โดยการเรียกใช้ getTechList()

เช่น หากแท็กที่สแกนรองรับ MifareCLASS, NdefFormatable และ NfcA ชุด tech-list ต้องระบุเทคโนโลยีทั้ง 3, 2 หรือ 1 อย่าง (ไม่มี อื่นๆ) เพื่อให้ระบบจับคู่กิจกรรมของคุณ

ตัวอย่างต่อไปนี้จะอธิบายเกี่ยวกับเทคโนโลยีทั้งหมด คุณต้องนํารายการที่ไม่เกี่ยวข้องออก สนับสนุนโดยแท็ก 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>

ดูข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับเทคโนโลยีแท็กและ Intent ของ ACTION_TECH_DISCOVERED ได้ที่การทำงานกับแท็กที่รองรับ เทคโนโลยีในเอกสาร NFC ขั้นสูง

ค้นพบแล้ว

หากต้องการกรองหาACTION_TAG_DISCOVERED ให้ใช้ Intent ต่อไปนี้ ตัวกรอง:

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

รับข้อมูลจาก Intent

หากกิจกรรมเริ่มต้นขึ้นเนื่องจาก Intent ของ NFC คุณสามารถดูข้อมูลเกี่ยวกับ NFC ที่สแกนได้ จาก Intent Intent อาจมีส่วนเพิ่มเติมต่อไปนี้โดยขึ้นอยู่กับแท็กที่สแกน

  • EXTRA_TAG (ต้องระบุ): ออบเจ็กต์ Tag จะแสดงแท็กที่สแกน
  • EXTRA_NDEF_MESSAGES (ไม่บังคับ): อาร์เรย์ของข้อความ NDEF แยกวิเคราะห์จากแท็ก ส่วนเสริมนี้จำเป็นสำหรับ ACTION_NDEF_DISCOVERED Intent
  • EXTRA_ID (ไม่บังคับ): รหัสระดับต่ำของแท็ก

หากต้องการรับสิทธิประโยชน์เพิ่มเติมเหล่านี้ ให้ตรวจสอบว่ากิจกรรมของคุณเปิดตัวด้วยหนึ่งใน Intent ของ NFC เพื่อให้แน่ใจว่ามีการสแกนแท็ก แล้วรับส่วนเพิ่มเติมจาก Intent ตัวอย่างต่อไปนี้ตรวจหา ACTION_NDEF_DISCOVERED Intent และรับข้อความ NDEF จาก Intent เพิ่มเติม

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 จาก Intent ซึ่งจะ มีเพย์โหลดและให้คุณแจกแจงเทคโนโลยีของแท็กได้ ดังนี้

Kotlin

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Java

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

สร้างประเภทระเบียน NDEF ทั่วไป

ส่วนนี้อธิบายวิธีการสร้างประเภทระเบียน NDEF ทั่วไปเพื่อช่วยเหลือคุณเมื่อเขียนถึง แท็ก NFC หรือการส่งข้อมูลด้วย Android Beam เริ่มตั้งแต่ Android 4.0 (API ระดับ 14) มีเมธอด createUri() ที่พร้อมช่วยคุณสร้าง ระเบียน URI โดยอัตโนมัติ เริ่มตั้งแต่ Android 4.1 (API ระดับ 16) createExternal() และ createMime() พร้อมช่วยคุณสร้าง MIME และระเบียน NDEF ประเภทภายนอก ใช้วิธีการของตัวช่วยต่อไปนี้ทุกครั้งที่ทำได้เพื่อหลีกเลี่ยงข้อผิดพลาด เมื่อสร้างระเบียน NDEF ด้วยตนเอง

ส่วนนี้จะอธิบายวิธีการสร้างโฆษณา Intent ของระเบียน ตัวอย่างระเบียน 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]);

ตัวกรอง Intent สำหรับระเบียน 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")));

ตัวกรอง Intent สำหรับระเบียน 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;
}

ตัวกรอง Intent สำหรับระเบียน 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);

ตัวกรอง Intent สำหรับระเบียน 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);

ตัวกรอง Intent สำหรับระเบียน 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 ทั่วไปเพิ่มเติมเพื่อสนับสนุนทั้ง 2 ประเภทได้ดียิ่งขึ้น อุปกรณ์ที่ใช้ Android และไม่ได้ใช้ Android

หมายเหตุ: URN สำหรับ TNF_EXTERNAL_TYPE มีรูปแบบ Canonical ดังต่อไปนี้ urn:nfc:ext:example.com:externalType อย่างไรก็ตาม ข้อกำหนด RTD ของฟอรัม 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 Application Record (AAR) ที่เปิดตัวใน Android 4.0 (API ระดับ 14) ช่วยให้ เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณเริ่มต้นเมื่อสแกนแท็ก NFC AAR มีชื่อแพ็กเกจ ของแอปพลิเคชันที่ฝังในระเบียน NDEF คุณเพิ่ม AAR ในระเบียน NDEF ใดก็ได้ของ NDEF เนื่องจาก Android จะค้นหา AAR ทั้งข้อความ NDEF หากพบ AAR ก็จะเริ่มทำงาน แอปพลิเคชันตามชื่อแพ็กเกจภายใน AAR หากไม่มีแอปพลิเคชันอยู่ใน อุปกรณ์ Google Play ได้เปิดตัวเพื่อดาวน์โหลดแอปพลิเคชัน

AAR จะมีประโยชน์ในกรณีที่คุณต้องการป้องกันไม่ให้แอปพลิเคชันอื่นๆ กรองด้วยความตั้งใจเดียวกันและ อาจจัดการแท็กเฉพาะที่คุณติดตั้งใช้งานไว้ได้ AAR ได้รับการรองรับที่ ระดับแอปพลิเคชัน เนื่องจากข้อจำกัดของชื่อแพ็กเกจ และไม่ได้ที่ระดับกิจกรรมเช่นเดียวกับ การกรอง Intent หากต้องการจัดการความตั้งใจที่ระดับกิจกรรม ให้ใช้ตัวกรอง Intent

หากแท็กมี AAR ระบบมอบหมายแท็กจะส่งไปในลักษณะต่อไปนี้

  1. ลองเริ่มกิจกรรมโดยใช้ตัวกรอง Intent ตามปกติ หากกิจกรรมที่ตรงกับ Intent ยังตรงกับ AAR ด้วย ให้เริ่มกิจกรรม
  2. หากกิจกรรมที่กรอง Intent ไม่ตรงกับ AAR หากมีกิจกรรมหลายรายการที่จัดการกับความตั้งใจได้ หรือไม่มีกิจกรรมใดจัดการความตั้งใจได้ ให้เริ่มต้น ที่ระบุโดย AAR
  3. หากไม่มีแอปพลิเคชันใดที่เริ่มต้นด้วย AAR ได้ ให้ไปที่ Google Play เพื่อดาวน์โหลด ที่อิงจาก AAR

หมายเหตุ: คุณสามารถลบล้าง AAR และระบบจ่ายงานของ Intent ด้วยฟังก์ชัน เบื้องหน้า ระบบการจ่ายงาน ซึ่งช่วยให้กิจกรรมที่ทำงานอยู่เบื้องหน้ามีลำดับความสำคัญสูงสุดเมื่อแท็ก NFC ค้นพบ เมื่อใช้วิธีนี้ กิจกรรมต้องอยู่ในเบื้องหน้าเพื่อลบล้าง AAR และ ระบบมอบหมาย Intent

หากยังต้องการกรองแท็กที่สแกนซึ่งไม่มี AAR คุณประกาศ Intent กรองตามปกติ วิธีนี้มีประโยชน์หากแอปพลิเคชันของคุณสนใจแท็กอื่นๆ ที่ไม่มี AAR เช่น คุณอาจต้องการรับประกันว่าแอปพลิเคชันของคุณจัดการกับ แท็กที่เป็นกรรมสิทธิ์ที่คุณทำให้ใช้งานได้ รวมถึงแท็กทั่วไปที่บุคคลที่สามนำไปใช้ โปรดทราบ ที่ AAR เฉพาะเจาะจงสำหรับอุปกรณ์ Android 4.0 ขึ้นไป ดังนั้นเมื่อทำให้แท็กใช้งานได้ คุณอาจต้องการ ใช้ประเภท AAR และ MIME ร่วมกันเพื่อรองรับอุปกรณ์ที่หลากหลายที่สุด ใน นอกจากนี้ เมื่อคุณติดตั้งใช้งานแท็ก NFC ให้คำนึงถึงวิธีที่ต้องการเขียนแท็ก NFC เพื่อเปิดใช้ สนับสนุนอุปกรณ์ส่วนใหญ่ (อุปกรณ์ที่ใช้ Android และอุปกรณ์อื่นๆ) คุณสามารถดำเนินการนี้ได้โดย การกำหนดประเภท MIME หรือ URI ที่ค่อนข้างเฉพาะตัวเพื่อให้แอปพลิเคชันแยกความแตกต่างได้ง่ายขึ้น

Android มี API ง่ายๆ สำหรับสร้าง AAR 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 Beam ช่วยให้แลกเปลี่ยนข้อมูลระหว่างอุปกรณ์ Android 2 เครื่องได้อย่างง่ายดาย แอปพลิเคชันที่ต้องการบีมข้อมูลไปยังอุปกรณ์อีกเครื่องหนึ่งจะต้องอยู่เบื้องหน้าและอุปกรณ์ การรับข้อมูลจะต้องไม่ถูกล็อก เมื่ออุปกรณ์บีมสัมผัสกับ อุปกรณ์รับสัญญาณ อุปกรณ์บีมจะแสดงข้อความ "แตะเพื่อบีม" UI จากนั้นผู้ใช้จะเลือก ควรจะบีมข้อความไปยังอุปกรณ์รับหรือไม่

หมายเหตุ: การพุช NDEF ที่ทำงานอยู่เบื้องหน้าพร้อมใช้งานที่ API ระดับ 10 ซึ่งมีฟังก์ชันการทำงานคล้ายกับ Android Beam API เหล่านี้เลิกใช้งานแล้ว แต่ พร้อมให้รองรับอุปกรณ์รุ่นเก่า ดูข้อมูลเพิ่มเติมที่ enableForegroundNdefPush()

คุณสามารถเปิดใช้งาน Android Beam สำหรับแอปพลิเคชันของคุณได้ด้วยการเรียกวิธีใดวิธีหนึ่งต่อไปนี้

  • setNdefPushMessage(): ยอมรับ NdefMessage เพื่อตั้งเป็นข้อความที่จะบีม บีมข้อความโดยอัตโนมัติ เมื่ออุปกรณ์ 2 เครื่องอยู่ใกล้กันเกินไป
  • setNdefPushMessageCallback(): ยอมรับการเรียกกลับที่มี วันที่ createNdefMessage() ซึ่งจะเรียกใช้เมื่ออุปกรณ์อยู่ในช่วงที่จะบีม Callback ช่วยให้คุณสร้าง ข้อความ NDEF เมื่อจำเป็นเท่านั้น

กิจกรรมจะพุชข้อความ NDEF ได้ทีละรายการเท่านั้น ดังนั้น setNdefPushMessageCallback() จะมีความสำคัญเหนือกว่า มากกว่า setNdefPushMessage() หากมีการตั้งค่าทั้งคู่ไว้ หากต้องการใช้งาน Androidบีมต้องเป็นไปตามหลักเกณฑ์ทั่วไปต่อไปนี้

  • กิจกรรมที่กำลังบีมข้อมูลจะต้องอยู่เบื้องหน้า อุปกรณ์ทั้ง 2 เครื่องต้องมี หน้าจอของตนปลดล็อกอยู่
  • คุณต้องสรุปข้อมูลที่กำลังบีมใน NdefMessage ออบเจ็กต์
  • อุปกรณ์ NFC ที่รับข้อมูลที่บีมต้องรองรับ com.android.npp โปรโตคอลการพุช NDEF หรือ SNEP ของฟอรัม NFC (แบบง่าย NDEF Exchange โปรโตคอล) ต้องใช้โปรโตคอล com.android.npp สำหรับอุปกรณ์ใน API ระดับ 9 (Android 2.3) เป็น API ระดับ 13 (Android 3.2) ต้องระบุทั้ง com.android.npp และ SNEP ใน API ระดับ 14 (Android 4.0) ขึ้นไป

หมายเหตุ: หากกิจกรรมของคุณเปิดใช้ Androidบีม และ ในเบื้องหน้า ระบบจะปิดระบบมอบหมาย Intent มาตรฐาน อย่างไรก็ตาม หากกิจกรรมของคุณ เปิดใช้งาน การส่งการทำงานในเบื้องหน้า จากนั้นโมเดลก็จะยังคงสแกนแท็กที่ตรงกับตัวกรอง Intent ที่ตั้งค่าใน การจ่ายงานที่ทำงานอยู่เบื้องหน้า

หากต้องการเปิดใช้งาน Android Beam ให้ทำดังนี้

  1. สร้าง NdefMessage ที่มี NdefRecord ที่คุณต้องการดันไปยังอุปกรณ์อื่น
  2. เรียก setNdefPushMessage() ด้วย NdefMessage หรือเรียกใช้ setNdefPushMessageCallback ผ่านในออบเจ็กต์ NfcAdapter.CreateNdefMessageCallback ในเมธอด onCreate() ของ กิจกรรมของคุณ วิธีการเหล่านี้ต้องมีกิจกรรมอย่างน้อย 1 รายการที่คุณต้องการเปิดใช้กับ Android บีมพร้อมกับรายการกิจกรรมอื่นๆ ที่สามารถเลือกได้

    โดยทั่วไปแล้วคุณมักจะใช้ setNdefPushMessage() หากกิจกรรมเฉพาะต้องการ ข้อความ NDEF เดียวกันได้ตลอดเวลา เมื่ออุปกรณ์ 2 เครื่องอยู่ในระยะที่สามารถสื่อสารกันได้ คุณใช้ 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 แอปพลิเคชันที่ระบุใน AAR จะได้รับข้อความ Android Beam เสมอ หากแอปพลิเคชันนั้นไม่ใช่ Google Play จะเริ่มดาวน์โหลดแอปพลิเคชัน ดังนั้น Intent ต่อไปนี้ ทางเทคนิคแล้วไม่มีความจำเป็นทางเทคนิคสำหรับอุปกรณ์ Android 4.0 ขึ้นไป หากใช้ AAR

<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 ด้วยตัวกรอง Intent นี้ เมื่อสแกนแท็ก NFC หรือได้รับ Android Beam โดยใช้ AAR เป็น ประเภท com.example.android.beam หรือเมื่อข้อความที่จัดรูปแบบ NDEF มีระเบียน MIME ประเภทapplication/vnd.com.example.android.beam

แม้ว่า AAR จะรับประกันว่าแอปพลิเคชันจะเริ่มต้นหรือดาวน์โหลด แต่ตัวกรอง Intent เนื่องจากจะช่วยให้คุณเริ่มต้นกิจกรรมที่ต้องการใน แทนที่จะเริ่มต้นกิจกรรมหลักภายในแพ็กเกจที่ระบุโดย AAR AAR ไม่มีรายละเอียดระดับกิจกรรม นอกจากนี้ เนื่องจากอุปกรณ์ที่ใช้ระบบ Android บางรุ่นไม่มี รองรับ AAR คุณควรฝังข้อมูลระบุตัวตนในระเบียน NDEF แรกของ NDEF ด้วย และกรองข้อความดังกล่าวด้วย เพื่อเผื่อกรณี ดูการสร้างร่วมกัน ประเภทของระเบียน NDEF เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างระเบียน