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