แอปสามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นเดียวกับที่แอปส่งข้อมูลไปยังแอปอื่นๆ ได้อีกด้วย ลองนึกถึงวิธีที่ผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณ และข้อมูลใด ประเภทที่คุณต้องการรับจากแอปพลิเคชันอื่นๆ หรือไม่ เช่น แอปพลิเคชันโซเชียลเน็ตเวิร์กอาจสนใจรับเนื้อหาข้อความ เช่น URL ของเว็บที่น่าสนใจ จากแอปอื่น
ผู้ใช้แอปอื่นๆ มักส่งข้อมูลไปยังแอปของคุณผ่าน Android บ่อยครั้ง Sharesheet หรือรีโซลเวอร์ Intent แอปที่ส่งข้อมูลไปยังแอปของคุณต้องตั้งค่า ประเภท MIME สำหรับข้อมูลนั้น แอปของคุณรับข้อมูลที่ส่งโดยแอปอื่นได้ดังนี้
Activity
ที่มีแท็กintent-filter
ที่ตรงกันในไฟล์ Manifest- การแชร์ทางลัดที่แอปของคุณเผยแพร่
เป้าหมายการแชร์โดยตรงคือ Deep Link ที่พาไปยังกิจกรรมที่เจาะจงภายในแอปของคุณ ซึ่งมักเป็นตัวแทนของบุคคลหรือกลุ่ม และ Android Sharesheet ของ Android จะแสดงให้ เช่น แอปรับส่งข้อความสามารถระบุเป้าหมายการแชร์โดยตรงสําหรับบุคคลที่ลิงก์ในรายละเอียดไปยังการสนทนากับบุคคลนั้นโดยตรง ดูวิธีการโดยละเอียดได้ที่หัวข้อระบุเป้าหมายการแชร์โดยตรง
รองรับประเภท MIME
โดยหลักการแล้ว แอปต้องสามารถรับประเภท MIME ได้หลากหลายที่สุดเท่าที่จะเป็นไปได้
ตัวอย่างเช่น แอปรับส่งข้อความที่ออกแบบมาสำหรับการส่งข้อความ รูปภาพ และวิดีโอควรรองรับการรับ text/*
, image/*
และ video/*
ต่อไปนี้คือประเภท MIME ที่พบบ่อย 2-3 ประเภทสำหรับส่งและรับข้อมูลธรรมดาใน 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
เมื่อได้รับวัตถุแล้ว ให้ตรวจสอบเนื้อหาเพื่อพิจารณาสิ่งที่ต้องทำต่อไป หากกิจกรรมนี้สามารถ
เริ่มต้นจากส่วนอื่นๆ ของระบบ (เช่น Launcher)
มาพิจารณาเมื่อพิจารณาเจตนา
โปรดตรวจสอบข้อมูลที่เข้ามาอย่างละเอียด เพราะคุณไม่ทราบว่าแอปพลิเคชันอื่นอาจส่งอะไรให้คุณ เช่น อาจมีการตั้งค่าประเภท 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 โดยทั้ง 2 รายการนี้กำหนดไว้ในไฟล์ Manifest คุณสามารถตั้งค่าป้ายกำกับตัวกรองกิจกรรมหรือความตั้งใจเพื่อให้บริบทเพิ่มเติม
สำหรับ Android 10 (API ระดับ 29) Android Sharesheet ของ Android จะใช้เฉพาะไอคอนที่ตั้งไว้ใน
ไฟล์ Manifest ในแท็ก application
Android ไม่สนใจไอคอนที่ตั้งค่าไว้ในแท็ก intent-filter
และ activity