เช่นเดียวกับที่แอปสามารถส่งข้อมูลไปยังแอปอื่นๆ ได้ แอปก็สามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นกัน ลองนึกถึงวิธีที่ผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณและประเภทข้อมูลที่คุณต้องการรับจากแอปพลิเคชันอื่นๆ ตัวอย่างเช่น แอปพลิเคชันเครือข่ายสังคมอาจสนใจรับเนื้อหาข้อความ เช่น URL เว็บที่น่าสนใจจากแอปอื่น
ผู้ใช้แอปอื่นๆ มักจะส่งข้อมูลไปยังแอปของคุณผ่าน Android Sharesheet หรือตัวแก้ปัญหา Intent แอปที่ส่งข้อมูลไปยังแอปของคุณต้องกำหนดประเภท MIME สำหรับข้อมูลนั้น แอปของคุณสามารถรับข้อมูลที่แอปอื่นส่งมาได้ด้วยวิธีต่อไปนี้
Activityที่มีแท็กintent-filterที่ตรงกันในไฟล์ Manifest- ทางลัดการแชร์ที่แอปของคุณเผยแพร่
เป้าหมายการแชร์โดยตรงคือ Deep Link ไปยัง Activity ที่เฉพาะเจาะจงภายในแอปของคุณ โดยมักจะแสดงถึงบุคคลหรือกลุ่ม และ Android Sharesheet จะแสดงเป้าหมายเหล่านี้ ตัวอย่างเช่น แอปรับส่งข้อความสามารถระบุเป้าหมายการแชร์โดยตรงสำหรับบุคคลหนึ่งๆ ซึ่งเป็นลิงก์ในรายละเอียดที่นำไปยังการสนทนากับบุคคลนั้นโดยตรง ดูวิธีการโดยละเอียดได้ที่ ระบุเป้าหมายการแชร์โดยตรง
ประเภท 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>
เมื่อแอปอื่นพยายามแชร์สิ่งเหล่านี้โดยการสร้าง an
Intent และส่งไปยัง startActivity() แอปพลิเคชันของคุณ
จะแสดงเป็นตัวเลือกใน Android Sharesheet หรือตัวแก้ปัญหา 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 หรืออาจ
ซับซ้อนมากขึ้น เช่น การใช้ฟิลเตอร์รูปภาพที่น่าสนใจกับรูปภาพ แอปของคุณจะเป็นตัวกำหนดสิ่งที่เกิดขึ้นต่อไป
การแชร์ URL ของภาพหน้าจอ
เมื่อถ่ายภาพหน้าจอ คุณสามารถแชร์ภาพหน้าจอและ URL ที่เชื่อมโยงได้
ซึ่งจะช่วยมอบประสบการณ์การใช้งานที่ดียิ่งขึ้น เมื่อได้รับ URL ให้ตรวจสอบว่าได้รับฟิลด์ EXTRA_TEXT จาก Intent ดังที่แสดงในตัวอย่างต่อไปนี้
override fun onCreate(savedInstanceState: Bundle?) {
...
when {
intent?.action == Intent.ACTION_SEND -> {
if (intent.type?.startsWith("image/") == true) {
handleSendImage(intent)
}
}
...
}
private fun handleSendImage(intent: Intent) {
(intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
// Handle the EXTRA_TEXT as well
intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
// Update UI to reflect image being shared and the EXTRA_TEXT
// if available
}
}
...
}
ตรวจสอบว่าผู้ใช้รู้จักแอปของคุณ
แอปของคุณจะแสดงด้วย ไอคอนและ ป้ายกำกับใน Android Sharesheet และตัวแก้ปัญหา Intent ซึ่งทั้ง 2 อย่างนี้กำหนดไว้ในไฟล์ Manifest คุณสามารถตั้งค่าป้ายกำกับกิจกรรมหรือตัวกรอง Intent เพื่อให้บริบทเพิ่มเติมได้
ตั้งแต่ Android 10 (ระดับ API 29) เป็นต้นไป Android Sharesheet จะใช้เฉพาะไอคอนที่ตั้งค่าไว้ในไฟล์ Manifest ในแท็ก application Android จะไม่สนใจไอคอนที่ตั้งค่าไว้ในแท็ก intent-filter และ activity