เมื่อสร้างแอป คุณควรพิจารณาแอปอื่นๆ ในอุปกรณ์ที่แอปของคุณต้องโต้ตอบด้วย หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป ระบบจะทำให้แอปบางแอปมองเห็นแอปของคุณโดยอัตโนมัติ แต่จะกรองแอปอื่นๆ ออกโดยค่าเริ่มต้น คู่มือนี้จะอธิบายวิธีทำให้แอปอื่นๆ เหล่านั้นปรากฏต่อแอปของคุณ
หากแอปกำหนดเป้าหมายเป็น Android 11 ขึ้นไปและจำเป็นต้องโต้ตอบกับแอปอื่นๆ นอกเหนือจากแอปที่มองเห็นได้โดยอัตโนมัติ ให้เพิ่มองค์ประกอบ <queries> ในไฟล์ Manifest ของแอป ภายในองค์ประกอบ <queries> ให้ระบุแอปอื่นๆ ตามชื่อแพ็กเกจ ตามลายเซ็น Intent หรือตามหน่วยงานของผู้ให้บริการ ตามที่อธิบายไว้ในส่วนต่อไปนี้
ชื่อแพ็กเกจที่เฉพาะเจาะจง
หากคุณทราบแอปที่ต้องการค้นหาหรือโต้ตอบด้วย เช่น แอปที่ผสานรวมกับแอปของคุณหรือแอปที่คุณใช้บริการ ให้ใส่ชื่อแพ็กเกจของแอปเหล่านั้นไว้ในชุดองค์ประกอบ <package> ภายในองค์ประกอบ <queries> ดังนี้
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
สื่อสารกับแอปโฮสต์ในไลบรารี
หากพัฒนาไลบรารี Android คุณสามารถประกาศความต้องการระดับการเข้าถึงแพ็กเกจได้โดยเพิ่มองค์ประกอบ <queries> ในไฟล์ Manifest ของ AAR องค์ประกอบ <queries> นี้มีฟังก์ชันการทำงานเหมือนกับองค์ประกอบที่แอปประกาศได้ในไฟล์ Manifest ของตนเอง
หากไลบรารีของคุณเกี่ยวข้องกับการสื่อสารกับแอปโฮสต์ เช่น การใช้บริการที่มีผลผูกพัน ให้รวมองค์ประกอบ <package> ที่ระบุชื่อแพ็กเกจของแอปโฮสต์ไว้ด้วย ดังนี้
<!-- Place inside the <queries> element. --> <package android:name=PACKAGE_NAME />
การใส่การประกาศนี้จะช่วยให้คุณตรวจสอบได้ว่ามีการติดตั้งแอปโฮสต์หรือไม่ และโต้ตอบกับแอปดังกล่าว เช่น โดยการเรียกใช้ bindService()
แอปการโทรที่ใช้ไลบรารีของคุณจะปรากฏขึ้นโดยอัตโนมัติในแอปโฮสต์อันเป็นผลมาจากการโต้ตอบนี้
แพ็กเกจที่ตรงกับลายเซ็นตัวกรอง Intent
แอปของคุณอาจต้องค้นหาหรือโต้ตอบกับชุดแอปที่ให้บริการตามวัตถุประสงค์หนึ่งๆ แต่คุณอาจไม่ทราบชื่อแพ็กเกจที่เฉพาะเจาะจงที่จะรวมไว้ ในกรณีนี้ คุณสามารถแสดงรายการลายเซ็นตัวกรอง Intent ในองค์ประกอบ <queries> ได้ จากนั้นแอปของคุณจะค้นพบแอปที่มีองค์ประกอบ <intent-filter> ที่ตรงกันได้
ตัวอย่างโค้ดต่อไปนี้แสดงองค์ประกอบ <intent> ที่จะอนุญาตให้แอปเห็นแอปอื่นๆ ที่ติดตั้งไว้ซึ่งรองรับการแชร์รูปภาพ JPEG
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
องค์ประกอบ <intent> มีข้อจำกัดบางประการ ดังนี้
- คุณต้องใส่องค์ประกอบ
<action>เพียง 1 รายการ - คุณไม่สามารถใช้แอตทริบิวต์
path,pathPrefix,pathPatternหรือportในองค์ประกอบ<data>ระบบจะทำงานเหมือนกับว่าคุณตั้งค่าของแต่ละแอตทริบิวต์เป็นอักขระไวลด์การ์ดทั่วไป (*) - คุณไม่สามารถใช้แอตทริบิวต์
mimeGroupขององค์ประกอบ<data> ภายในองค์ประกอบ
<data>ขององค์ประกอบ<intent>รายการเดียว คุณจะใช้แอตทริบิวต์ต่อไปนี้ได้ไม่เกิน 1 ครั้งmimeTypeschemehost
คุณสามารถกระจายแอตทริบิวต์เหล่านี้ไปยังองค์ประกอบ
<data>หลายรายการหรือใช้ในองค์ประกอบ<data>รายการเดียวก็ได้
องค์ประกอบ <intent> รองรับอักขระไวลด์การ์ดทั่วไป (*) เป็นค่าสำหรับแอตทริบิวต์บางรายการ ดังนี้
- แอตทริบิวต์
nameขององค์ประกอบ<action> - ประเภทย่อยของแอตทริบิวต์
mimeTypeขององค์ประกอบ<data>(image/*) - ประเภทและประเภทย่อยของแอตทริบิวต์
mimeTypeขององค์ประกอบ<data>(*/*) - แอตทริบิวต์
schemeขององค์ประกอบ<data> - แอตทริบิวต์
hostขององค์ประกอบ<data>
ระบบไม่รองรับการผสมข้อความและอักขระไวลด์การ์ด เช่น prefix* เว้นแต่จะระบุไว้เป็นอย่างอื่นในรายการก่อนหน้า
แพ็กเกจที่ใช้หน่วยงานที่เฉพาะเจาะจง
หากต้องการค้นหา Content Provider แต่ไม่ทราบชื่อแพ็กเกจที่เฉพาะเจาะจง คุณสามารถประกาศสิทธิ์ของผู้ให้บริการในองค์ประกอบ <provider> ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
คุณประกาศสิทธิ์ของผู้ให้บริการได้ในองค์ประกอบ <queries> เดียว ภายในองค์ประกอบ <queries> คุณสามารถประกาศองค์ประกอบ <provider> ได้อย่างน้อย 1 รายการ องค์ประกอบ <provider> สามารถรวมสิทธิ์ของผู้ให้บริการรายการเดียวหรือรายการสิทธิ์ของผู้ให้บริการที่คั่นด้วยเครื่องหมายเซมิโคลอน
แอปทั้งหมด (ไม่แนะนำ)
ในบางกรณีซึ่งเกิดขึ้นไม่บ่อยนัก แอปของคุณอาจต้องค้นหาหรือโต้ตอบกับแอปที่ติดตั้งไว้ทั้งหมดในอุปกรณ์ โดยไม่ขึ้นอยู่กับคอมโพเนนต์ที่มีอยู่ ระบบจะให้สิทธิ์ QUERY_ALL_PACKAGES เพื่ออนุญาตให้แอปของคุณดูแอปอื่นๆ ทั้งหมดที่ติดตั้งไว้
ตัวอย่างกรณีการใช้งานที่เหมาะสมในการรวมสิทธิ์ QUERY_ALL_PACKAGES ไว้ด้วยมีดังนี้
- แอปการช่วยเหลือพิเศษ
- เบราว์เซอร์
- แอปการจัดการอุปกรณ์
- แอปความปลอดภัย
- แอปป้องกันไวรัส
อย่างไรก็ตาม โดยปกติแล้วคุณสามารถดำเนินการตาม Use Case ของแอปได้โดยการโต้ตอบกับชุดแอปที่มองเห็นได้โดยอัตโนมัติ และโดยการประกาศแอปอื่นๆ ที่แอปของคุณจำเป็นต้องเข้าถึงในไฟล์ Manifest แอปของคุณควรขอระดับการเข้าถึงแพ็กเกจที่จำเป็นน้อยที่สุดเพื่อให้แอปทำงานได้ ทั้งนี้เพื่อเคารพความเป็นส่วนตัวของผู้ใช้
การปรับปรุงนโยบายจาก Google Play นี้ให้หลักเกณฑ์สำหรับแอปที่ต้องใช้สิทธิ์ QUERY_ALL_PACKAGES