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

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

ในแอปที่ใช้ Compose Navigation การรับข้อมูลที่แอปอื่นส่งมาเป็นกระบวนการ 2 ขั้นตอน ดังนี้

  1. ประกาศ <intent-filter> ในไฟล์ Manifest: คุณยังคงต้องเพิ่มตัวกรอง Intent ลงในกิจกรรมในไฟล์ AndroidManifest.xml ซึ่งจะบอกระบบปฏิบัติการ Android ว่าแอปพลิเคชันของคุณรับการดำเนินการที่เฉพาะเจาะจง (เช่น ACTION_SEND) และประเภท MIME (เช่น text/plain) ได้

  2. กำหนด navDeepLink ในกราฟการนำทางของ Compose: แทนที่จะดักจับและแยกวิเคราะห์ Intent ภายในเมธอด onCreate หรือ onNewIntent ของ Activity ด้วยตนเอง ให้ใช้การรองรับ Deep Link ของ Compose Navigation แนบ navDeepLink ที่ตรงกับการดำเนินการและประเภท MIME โดยตรงกับปลายทางที่ใช้ได้ ซึ่งควรแสดงเนื้อหา NavController จะ สกัดกั้น Intent โดยอัตโนมัติและนำผู้ใช้ไปยังหน้าจอนั้นโดยตรง

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

รองรับประเภท 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 หรือตัวแก้ไข Intent หากผู้ใช้เลือกแอปของคุณ ระบบจะเริ่มกิจกรรมที่เกี่ยวข้อง (.ui.MyActivity ใน ตัวอย่างก่อนหน้า) จากนั้นคุณจะต้องจัดการเนื้อหาอย่างเหมาะสม ภายในโค้ดและ UI

จัดการเนื้อหาที่เข้ามา

หากต้องการจัดการเนื้อหาที่ Intent แสดง ให้เรียกใช้ getIntent() เพื่อรับออบเจ็กต์ Intent เมื่อมีออบเจ็กต์แล้ว คุณจะตรวจสอบเนื้อหาของออบเจ็กต์เพื่อพิจารณาสิ่งที่จะทำต่อไปได้ หากเริ่มกิจกรรมนี้จากส่วนอื่นๆ ของระบบได้ (เช่น ตัวเรียกใช้) ให้พิจารณาเรื่องนี้เมื่อตรวจสอบ Intent

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

@Composable
fun SharesheetHandler() {
    val activity = LocalActivity.current
    val intent = activity?.intent

    when (intent?.action) {
        Intent.ACTION_SEND -> {
            if (intent.type == "text/plain") {
                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
        }
    }
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI state with the shared text
    }
}

private fun handleSendImage(intent: Intent) {
    val imageUri = IntentCompat.getParcelableExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUri?.let {
        // Update UI state with the shared image
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    val imageUris =
        IntentCompat.getParcelableArrayListExtra(intent, Intent.EXTRA_STREAM, Uri::class.java)
    imageUris?.let {
        // Update UI state with the shared images
    }
}

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

การแชร์ 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 UI state with the shared image and the EXTRA_TEXT if available
}

ตรวจสอบว่าผู้ใช้รู้จักแอปของคุณ

แอปของคุณจะแสดงด้วยไอคอนและป้ายกำกับในชีตการแชร์และตัวแก้ไข Intent ของ Android ทั้ง 2 อย่างนี้กำหนดไว้ในไฟล์ Manifest คุณ ตั้งค่าป้ายกำกับตัวกรองกิจกรรมหรือตัวกรอง Intent เพื่อให้บริบทเพิ่มเติมได้

ตั้งแต่ Android 10 (ระดับ API 29) เป็นต้นไป Android Sharesheet จะใช้เฉพาะไอคอนที่ตั้งค่าไว้ในไฟล์ Manifest ในแท็ก application เท่านั้น Android จะไม่สนใจไอคอนที่ตั้งค่าในแท็ก intent-filter และ activity