เอกสารนี้อธิบายงานพื้นฐานของ 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 จะแยกวิเคราะห์และพยายามค้นหาแอปพลิเคชันที่สนใจข้อมูลที่สแกน ทั้งนี้ ซึ่งทำโดย:
- แยกวิเคราะห์แท็ก NFC และหาประเภท MIME หรือ URI ที่ระบุเพย์โหลดข้อมูล ในแท็ก
- การห่อหุ้มประเภท MIME หรือ URI และเพย์โหลดลงใน Intent 2 รายการแรกนี้ เราได้อธิบายขั้นตอนไว้ในวิธีที่แท็ก NFC จับคู่กับประเภท MIME และ URI
- เริ่มกิจกรรมตามความตั้งใจ ซึ่งอธิบายไว้ใน วิธีการส่งแท็ก 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 อย่าง ซึ่งจะเรียงตามลำดับความสำคัญสูงสุดไปหาต่ำสุด ดังนี้
-
ACTION_NDEF_DISCOVERED
: Intent นี้ใช้เพื่อเริ่มต้น การทำงานเมื่อสแกนแท็กที่มีเพย์โหลด NDEF และเป็นประเภทที่รู้จัก นี่คือ ความตั้งใจที่มีลำดับความสำคัญสูงสุด และระบบจ่ายแท็กจะพยายามเริ่มกิจกรรมด้วย ก่อนความตั้งใจอื่นๆ เมื่อเป็นไปได้ ACTION_TECH_DISCOVERED
: หากไม่มีกิจกรรมใดลงทะเบียน จัดการACTION_NDEF_DISCOVERED
ระบบการจ่ายแท็กจะพยายามเริ่มต้นแอปพลิเคชันด้วย Intent นี้ ช่วงเวลานี้ Intent จะเริ่มต้นโดยตรงด้วย (โดยไม่ต้องเริ่มACTION_NDEF_DISCOVERED
ก่อน) หากแท็กที่สแกน มีข้อมูล NDEF ที่จับคู่กับประเภท MIME หรือ URI ไม่ได้ หรือหากแท็กไม่มี NDEF แต่เป็นเทคโนโลยีแท็กที่รู้จักACTION_TAG_DISCOVERED
: Intent นี้เริ่มขึ้นแล้ว หากไม่มีกิจกรรมที่เกี่ยวข้องกับACTION_NDEF_DISCOVERED
หรือACTION_TECH_DISCOVERED
Intent
วิธีการทำงานของระบบส่งแท็กแบบพื้นฐานมีดังนี้
- ลองเริ่มกิจกรรมด้วย Intent ที่สร้างขึ้นโดยระบบการจ่ายแท็ก
เมื่อแยกวิเคราะห์แท็ก NFC (
ACTION_NDEF_DISCOVERED
หรือACTION_TECH_DISCOVERED
) - หากไม่มีตัวกรองกิจกรรมสำหรับความตั้งใจนั้น ให้ลองเริ่มกิจกรรมด้วย
Intent ที่มีลำดับความสำคัญต่ำสุด (
ACTION_TECH_DISCOVERED
หรือACTION_TAG_DISCOVERED
) จนกว่าแอปพลิเคชันจะกรอง ของความตั้งใจหรือจนกว่าระบบการจ่ายแท็กจะพยายามทำ Intent ที่เป็นไปได้ทั้งหมด - หากไม่มีแอปพลิเคชันกรอง Intent ใด ก็ไม่ต้องดำเนินการใดๆ
![](https://developer.android.google.cn/static/images/nfc_tag_dispatch.png?authuser=7&hl=th)
หากเป็นไปได้ ให้ทำงานกับข้อความ 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
IntentEXTRA_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 ระบบมอบหมายแท็กจะส่งไปในลักษณะต่อไปนี้
- ลองเริ่มกิจกรรมโดยใช้ตัวกรอง Intent ตามปกติ หากกิจกรรมที่ตรงกับ Intent ยังตรงกับ AAR ด้วย ให้เริ่มกิจกรรม
- หากกิจกรรมที่กรอง Intent ไม่ตรงกับ AAR หากมีกิจกรรมหลายรายการที่จัดการกับความตั้งใจได้ หรือไม่มีกิจกรรมใดจัดการความตั้งใจได้ ให้เริ่มต้น ที่ระบุโดย AAR
- หากไม่มีแอปพลิเคชันใดที่เริ่มต้นด้วย 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 ให้ทำดังนี้
- สร้าง
NdefMessage
ที่มีNdefRecord
ที่คุณต้องการดันไปยังอุปกรณ์อื่น - เรียก
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 เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างระเบียน