ขณะสร้างแอป คุณควรพิจารณาแอปอื่นๆ ในอุปกรณ์ที่แอปของคุณต้องโต้ตอบด้วย หากแอปกำหนดเป้าหมายเป็น 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>
รายการเดียวmimeType
scheme
host
คุณสามารถกระจายแอตทริบิวต์เหล่านี้ไปยังองค์ประกอบ
<data>
หลายรายการหรือใช้แอตทริบิวต์เหล่านั้นในองค์ประกอบ<data>
รายการเดียวก็ได้
องค์ประกอบ <intent>
รองรับอักขระไวลด์การ์ดทั่วไป (*
) เป็นค่าสำหรับแอตทริบิวต์บางรายการ ดังนี้
- แอตทริบิวต์
name
ขององค์ประกอบ<action>
- ประเภทย่อยของแอตทริบิวต์
mimeType
ขององค์ประกอบ<data>
(image/*
) - ประเภทและประเภทย่อยของแอตทริบิวต์
mimeType
ขององค์ประกอบ<data>
(*/*
) - แอตทริบิวต์
scheme
ขององค์ประกอบ<data>
- แอตทริบิวต์
host
ขององค์ประกอบ<data>
ระบบจะไม่รองรับอักขระข้อความและไวลด์การ์ดผสมกัน เช่น prefix*
เว้นแต่จะระบุไว้เป็นอย่างอื่นในรายการก่อนหน้า
แพ็กเกจที่ใช้หน่วยงานที่เฉพาะเจาะจง
หากต้องการค้นหาผู้ให้บริการเนื้อหาแต่ไม่ทราบชื่อแพ็กเกจที่เฉพาะเจาะจง คุณสามารถประกาศสิทธิ์ของผู้ให้บริการในองค์ประกอบ <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