รับข้อมูลอย่างง่ายจากแอปอื่นๆ

แอปสามารถส่งข้อมูลไปยังแอปอื่นๆ ได้ เช่นเดียวกับที่แอปสามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นกัน พิจารณาว่าผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณอย่างไรและคุณต้องการรับข้อมูลประเภทใดจากแอปพลิเคชันอื่นๆ เช่น แอปพลิเคชันเครือข่ายสังคมออนไลน์อาจสนใจรับเนื้อหาข้อความ เช่น URL เว็บที่น่าสนใจ จากแอปอื่น

ผู้ใช้แอปอื่นๆ มักจะส่งข้อมูลไปยังแอปของคุณผ่าน Android Sharesheet หรือตัวแก้ไข Intent แอปที่ส่งข้อมูลไปยังแอปของคุณต้องตั้งค่า ประเภท MIME สำหรับข้อมูลนั้น แอปของคุณรับข้อมูลที่แอปอื่นส่งมาได้ด้วยวิธีต่อไปนี้

  • Activity ที่มีแท็ก intent-filter ที่ตรงกันในไฟล์ Manifest
  • การแชร์ทางลัดที่แอปของคุณเผยแพร่

เป้าหมายการแชร์โดยตรงคือ Deep Link ไปยังกิจกรรมที่เฉพาะเจาะจงภายในแอป โดยมักจะแสดงถึงบุคคลหรือกลุ่ม และ Android Sharesheet จะแสดงเป้าหมายเหล่านั้น ตัวอย่างเช่น แอปรับส่งข้อความสามารถระบุเป้าหมายการแชร์โดยตรงสำหรับบุคคลที่ ลิงก์ในรายละเอียดจะนำผู้ใช้ไปยังการสนทนากับบุคคลนั้นโดยตรง ดูวิธีการโดยละเอียดได้ที่หัวข้อ ระบุเป้าหมายการแชร์โดยตรง

รองรับประเภท MIME

ในอุดมคติแล้ว แอปต้องรับประเภท MIME ได้หลากหลายที่สุดเท่าที่จะเป็นไปได้ เช่น แอปรับส่งข้อความที่ออกแบบมาเพื่อส่งข้อความ รูปภาพ และวิดีโอ ควรจะรองรับการรับ text/*, image/* และ video/* ต่อไปนี้คือ ประเภท MIME ที่พบบ่อยสำหรับการส่งและรับข้อมูลอย่างง่ายใน Android

ผู้รับลงทะเบียนเพื่อ ผู้ส่งส่ง
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
image/*
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
นามสกุลไฟล์ที่รองรับ 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 เมื่อมีออบเจ็กต์แล้ว คุณจะตรวจสอบเนื้อหาของออบเจ็กต์เพื่อพิจารณาสิ่งที่จะทำต่อไปได้ หากเริ่มกิจกรรมนี้จากส่วนอื่นๆ ของระบบได้ (เช่น ตัวเรียกใช้) ให้พิจารณาเรื่องนี้เมื่อตรวจสอบ Intent

โปรดตรวจสอบข้อมูลขาเข้าอย่างละเอียด เนื่องจากคุณไม่ทราบว่าแอปพลิเคชันอื่นๆ อาจส่งอะไรมาให้คุณ เช่น อาจมีการตั้งค่าประเภท MIME ที่ไม่ถูกต้อง หรือรูปภาพที่ส่งอาจมีขนาดใหญ่มาก นอกจากนี้ อย่าลืมประมวลผลข้อมูลไบนารี ในเทรดแยกต่างหากแทนเทรดหลัก ("UI")

@Composable
fun SharesheetHandler() {
    val context = LocalContext.current
    val intent = (context as? Activity)?.intent

    when (intent?.action) {
        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_SEND_MULTIPLE -> {
            if (intent.type?.startsWith("image/") == true) {
                handleSendMultipleImages(intent) // Handle multiple images being sent
            }
        }

        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
}

fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update ViewModel state to change state of text being shared
    }
}

fun handleSendImage(intent: Intent) {
    IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image being shared
    }
}

fun handleSendMultipleImages(intent: Intent) {
    IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
        // Update ViewModel state to change state of image(s) being shared
    }
}

การอัปเดต UI หลังจากได้รับข้อมูลอาจทำได้ง่ายๆ เพียงแค่ป้อนข้อมูลลงใน EditText หรืออาจซับซ้อนกว่านั้น เช่น การใช้ฟิลเตอร์ภาพที่น่าสนใจกับรูปภาพ แอปของคุณจะเป็นผู้กำหนดสิ่งที่จะเกิดขึ้นต่อไป

การแชร์ URL ของภาพหน้าจอ

เมื่อถ่ายภาพหน้าจอ คุณจะแชร์ภาพหน้าจอและ URL ที่เกี่ยวข้องได้ ซึ่งจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดียิ่งขึ้น เมื่อได้รับ URL โปรดตรวจสอบว่าได้รับฟิลด์ EXTRA_TEXT จาก Intent ดังที่แสดงในตัวอย่างต่อไปนี้

IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java).let {
    // Handle the EXTRA_TEXT as well
    val extraText = intent.getCharSequenceExtra(Intent.EXTRA_TEXT)
    // Update ViewModel state to change state 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