แอปสามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นเดียวกับที่ส่งข้อมูลไปยังแอปอื่นๆ ลองนึกถึงวิธีที่ผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณและประเภทข้อมูลที่ต้องการรับจากแอปพลิเคชันอื่นๆ เช่น แอปพลิเคชันโซเชียลเน็ตเวิร์กอาจสนใจรับเนื้อหาข้อความ เช่น URL ของเว็บที่น่าสนใจ จากแอปอื่น
ผู้ใช้แอปอื่นๆ ส่งข้อมูลไปยังแอปของคุณผ่าน Android Sharesheet หรือโปรแกรมแก้ไข Intent เป็นประจำ แอปที่ส่งข้อมูลไปยังแอปของคุณต้องตั้งค่าประเภท MIME สําหรับข้อมูลนั้น แอปของคุณรับข้อมูลที่ส่งโดยแอปอื่นได้ดังนี้
Activity
ที่มีแท็กintent-filter
ที่ตรงกันในไฟล์ Manifest- การแชร์ทางลัดที่แอปของคุณเผยแพร่
เป้าหมายการแชร์โดยตรงคือ Deep Link ที่ไปยังกิจกรรมที่เฉพาะเจาะจงภายในแอป ซึ่งมักจะแสดงถึงบุคคลหรือกลุ่ม และชีตการแชร์ของ Android จะแสดงเป้าหมายเหล่านี้ เช่น แอปรับส่งข้อความสามารถระบุเป้าหมายการแชร์โดยตรงสําหรับบุคคลที่ลิงก์ในรายละเอียดไปยังการสนทนากับบุคคลนั้นโดยตรง ดูวิธีการโดยละเอียดได้ที่หัวข้อระบุเป้าหมายการแชร์โดยตรง
รองรับประเภท MIME
โดยหลักการแล้ว แอปต้องรับประเภท MIME ได้หลากหลายที่สุด
ตัวอย่างเช่น แอปรับส่งข้อความที่ออกแบบมาสำหรับการส่งข้อความ รูปภาพ และวิดีโอควรรองรับการรับ text/*
, image/*
และ video/*
ต่อไปนี้คือประเภท MIME ที่พบบ่อยสำหรับส่งและรับข้อมูลธรรมดาใน Android
ผู้รับลงทะเบียนเพื่อรับ | ผู้ส่งส่ง |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
นามสกุลไฟล์ที่รองรับ | application/pdf |
โปรดดูที่รีจิสทรีอย่างเป็นทางการของประเภทสื่อ MIME ของ IANA
สร้างเป้าหมายการแชร์ที่น่าสนใจ
เมื่อผู้ใช้แตะเป้าหมายการแชร์ที่เชื่อมโยงกับกิจกรรมหนึ่งๆ ผู้ใช้ควรยืนยันและแก้ไขเนื้อหาที่แชร์ก่อนใช้งานได้ ซึ่งสำคัญอย่างยิ่งสำหรับข้อมูลข้อความ
รับข้อมูลด้วยกิจกรรม
การรับข้อมูลด้วยกิจกรรมเกี่ยวข้องกับการอัปเดตไฟล์ Manifest, การจัดการเนื้อหาขาเข้า และการตรวจสอบว่าผู้ใช้จดจำแอปของคุณได้
อัปเดตไฟล์ Manifest
ตัวกรอง Intent จะแจ้งให้ระบบทราบว่าคอมโพเนนต์แอปยอมรับ Intent ใด
คุณสร้างตัวกรอง Intent เพื่อรับ Intent ที่มีการดำเนินการนี้ในลักษณะเดียวกับการสร้าง Intent ที่มีการดำเนินการ ACTION_SEND
ในบทเรียนการส่งข้อมูลอย่างง่ายไปยังแอปอื่นๆ คุณกำหนดตัวกรอง Intent ในไฟล์ Manifest ได้โดยใช้องค์ประกอบ <intent-filter>
ตัวอย่างเช่น หากแอปจัดการการรับเนื้อหาข้อความ ไฟล์ Manifest ที่มีรูปภาพอย่างน้อย 1 รูปไม่ว่าประเภทใดก็ตามจะมีลักษณะดังนี้
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
เมื่อแอปอื่นพยายามแชร์สิ่งเหล่านี้ด้วยการสร้าง Intent และส่งไปยัง startActivity()
แอปพลิเคชันของคุณจะแสดงเป็นตัวเลือกในหน้าจอการแชร์ของ Android หรือเครื่องมือแก้ไข Intent หากผู้ใช้เลือกแอปของคุณ ระบบจะเริ่มกิจกรรมที่เกี่ยวข้อง (.ui.MyActivity
ในตัวอย่างก่อนหน้านี้) จากนั้นคุณก็จัดการเนื้อหาอย่างเหมาะสมภายในโค้ดและ UI ได้
จัดการเนื้อหาขาเข้า
หากต้องการจัดการเนื้อหาที่ส่งโดย Intent
ให้เรียกใช้ getIntent()
เพื่อรับออบเจ็กต์ Intent
เมื่อได้รับวัตถุแล้ว ให้ตรวจสอบเนื้อหาเพื่อพิจารณาสิ่งที่ต้องทำต่อไป หากกิจกรรมนี้เริ่มได้จากส่วนอื่นๆ ของระบบ (เช่น ตัวเปิดแอป) ให้พิจารณาเรื่องนี้เมื่อตรวจสอบ Intent
โปรดตรวจสอบข้อมูลที่เข้ามาอย่างละเอียด เนื่องจากคุณไม่ทราบว่าแอปพลิเคชันอื่นอาจส่งข้อมูลอะไรให้คุณ เช่น อาจมีการตั้งค่าประเภท MIME ที่ไม่ถูกต้อง หรือรูปภาพที่ส่งอาจมีขนาดใหญ่มาก นอกจากนี้ โปรดอย่าลืมประมวลผลข้อมูลไบนารีในเธรดแยกต่างหาก ไม่ใช่เธรดหลัก ("UI")
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
การอัปเดต UI หลังจากได้รับข้อมูลอาจทำได้ง่ายๆ เพียงป้อนข้อมูลใน EditText
หรืออาจซับซ้อนกว่านั้น เช่น การใช้ฟิลเตอร์รูปภาพที่น่าสนใจกับรูปภาพ การดำเนินการต่อนั้นขึ้นอยู่กับแอปของคุณ
ตรวจสอบว่าผู้ใช้จดจำแอปของคุณได้
แอปของคุณจะแสดงด้วยไอคอนและป้ายกำกับใน Android Sharesheet และ Intent Resolver โดยทั้ง 2 รายการนี้กำหนดไว้ในไฟล์ Manifest คุณสามารถตั้งค่าป้ายกำกับตัวกรองกิจกรรมหรือความตั้งใจเพื่อให้บริบทเพิ่มเติม
ตั้งแต่ Android 10 (API ระดับ 29) เป็นต้นไป แถบแชร์ของ Android จะใช้เฉพาะไอคอนที่ตั้งค่าไว้ในไฟล์ Manifest บนแท็ก application
Android ไม่สนใจไอคอนที่ตั้งค่าไว้ในแท็ก intent-filter
และ activity