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

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

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

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

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

รองรับประเภท 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 เมื่อมีออบเจ็กต์แล้ว คุณจะตรวจสอบเนื้อหาเพื่อดูว่าต้องทำอะไรต่อไปได้ หากกิจกรรมนี้สามารถ เริ่มต้นจากส่วนอื่นๆ ของระบบ (เช่น 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