จำกัดการโต้ตอบกับแอปอื่นๆ

สิทธิ์ไม่ได้มีไว้สำหรับการขอฟังก์ชันการทำงานของระบบเท่านั้น นอกจากนี้ คุณยังจำกัดวิธีที่แอปอื่นๆ สามารถโต้ตอบกับคอมโพเนนต์ของแอปได้ด้วย

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

ตรวจสอบสิทธิ์ของแอปอื่น

หากต้องการดูชุดสิทธิ์ที่แอปอื่นประกาศ ให้ใช้อุปกรณ์หรือโปรแกรมจำลองเพื่อทำตามขั้นตอนต่อไปนี้

  1. เปิดหน้าจอข้อมูลแอปของแอป
  2. เลือกสิทธิ์ หน้าจอสิทธิ์ของแอปจะโหลดขึ้น

    หน้าจอนี้จะแสดงชุดกลุ่มสิทธิ์ ระบบจะจัดระเบียบชุดสิทธิ์ที่แอปประกาศไว้เป็นกลุ่มเหล่านี้

การตรวจสอบสิทธิ์ยังมีวิธีอื่นๆ ที่เป็นประโยชน์อีกมากมาย ดังนี้

  • ขณะเรียกใช้บริการ ให้ส่งสตริงสิทธิ์ไปยัง Context.checkCallingPermission() เมธอดนี้จะแสดงผลจำนวนเต็มที่ระบุว่ามีการให้สิทธิ์ดังกล่าวแก่กระบวนการเรียกใช้ปัจจุบันหรือไม่ โปรดทราบว่าคุณจะใช้ตัวเลือกนี้ได้ก็ต่อเมื่อดำเนินการเรียกขามจากกระบวนการอื่น ซึ่งโดยปกติแล้วจะเป็นผ่านอินเทอร์เฟซ IDL ที่เผยแพร่จากบริการหรือด้วยวิธีอื่นๆ ที่ส่งไปยังกระบวนการอื่น
  • หากต้องการตรวจสอบว่ากระบวนการอื่นได้รับสิทธิ์บางอย่างหรือไม่ ให้ส่งผ่านกระบวนการ (PID) ไปยัง Context.checkPermission()
  • หากต้องการตรวจสอบว่าแพ็กเกจอื่นได้รับสิทธิ์บางอย่างหรือไม่ ให้ส่งชื่อแพ็กเกจไปยัง PackageManager.checkPermission()

จำกัดการโต้ตอบกับกิจกรรมของแอป

ใช้แอตทริบิวต์ android:permission กับแท็ก <activity> ในไฟล์ Manifest เพื่อจำกัดแอปอื่นๆ ที่จะเริ่มActivityนั้นได้ ระบบจะตรวจสอบสิทธิ์ระหว่าง Context.startActivity() ถึง Activity.startActivityForResult() หากผู้โทรไม่มีสิทธิ์ที่จำเป็น ระบบจะแสดงข้อความ SecurityException

จำกัดการโต้ตอบกับบริการของแอป

ใช้แอตทริบิวต์ android:permission กับแท็ก <service> ในไฟล์ Manifest เพื่อจำกัดแอปอื่นๆ ที่จะเริ่มหรือเชื่อมโยงกับ Service ที่เชื่อมโยง ระบบจะตรวจสอบสิทธิ์ระหว่าง Context.startService(), Context.stopService() และ Context.bindService() หากผู้โทรไม่มีสิทธิ์ที่จําเป็น SecurityException จะเกิดขึ้น

จำกัดการโต้ตอบกับผู้ให้บริการเนื้อหาของแอป

ใช้แอตทริบิวต์ android:permission กับแท็ก <provider> เพื่อจํากัดแอปอื่นๆ ที่เข้าถึงข้อมูลใน ContentProvider ได้ (ผู้ให้บริการเนื้อหามีเครื่องมือรักษาความปลอดภัยเพิ่มเติมที่สำคัญที่เรียกว่าสิทธิ์ URI ซึ่งอธิบายไว้ในส่วนต่อไปนี้) ต่างจากคอมโพเนนต์อื่นๆ ตรงที่แอตทริบิวต์สิทธิ์ที่คุณตั้งค่าสำหรับผู้ให้บริการเนื้อหามี 2 รายการ ได้แก่ android:readPermission ซึ่งจำกัดแอปอื่นๆ ที่อ่านจากผู้ให้บริการได้ และ android:writePermission ซึ่งจำกัดแอปอื่นๆ ที่เขียนลงในผู้ให้บริการได้ โปรดทราบว่าหากผู้ให้บริการได้รับการปกป้องด้วยทั้งสิทธิ์อ่านและเขียน การมีสิทธิ์เขียนเพียงอย่างเดียวจะไม่อนุญาตให้แอปอ่านข้อมูลจากผู้ให้บริการ

ระบบจะตรวจสอบสิทธิ์เมื่อดึงข้อมูลผู้ให้บริการเป็นครั้งแรก และเมื่อแอปดําเนินการกับผู้ให้บริการ หากแอปที่ขอไม่มีสิทธิ์ดังกล่าว ระบบจะแสดง SecurityException การใช้ ContentResolver.query() ต้องใช้สิทธิ์อ่าน ส่วนการใช้ ContentResolver.insert(), ContentResolver.update() หรือ ContentResolver.delete() ต้องใช้สิทธิ์เขียน ในทุกกรณีเหล่านี้ การไม่มีสิทธิ์ที่จําเป็นจะส่งผลให้เกิดSecurityException

ให้สิทธิ์เข้าถึงตาม URI

ระบบให้คุณควบคุมอย่างละเอียดเพิ่มเติมเกี่ยวกับวิธีที่แอปอื่นๆ สามารถเข้าถึงผู้ให้บริการเนื้อหาของแอป โดยเฉพาะอย่างยิ่ง ผู้ให้บริการเนื้อหาสามารถปกป้องตนเองด้วยสิทธิ์อ่านและเขียน ในขณะที่ยังคงอนุญาตให้ไคลเอ็นต์โดยตรงแชร์ URI ที่เฉพาะเจาะจงกับแอปอื่นๆ ได้ หากต้องการประกาศการรองรับรูปแบบนี้ของแอป ให้ใช้แอตทริบิวต์ android:grantUriPermissions หรือองค์ประกอบ <grant-uri-permission>

นอกจากนี้ คุณยังให้สิทธิ์ตาม URI แต่ละรายการได้ด้วย เมื่อเริ่มกิจกรรมหรือแสดงผลลัพธ์ของกิจกรรม ให้ตั้งค่า Flag Intent.FLAG_GRANT_READ_URI_PERMISSION ของ Intent, Flag Intent.FLAG_GRANT_WRITE_URI_PERMISSION ของ Intent หรือทั้ง 2 Flag ซึ่งจะให้สิทธิ์การอ่าน การเขียน หรือการอ่าน/เขียนแก่แอปอื่นๆ ตามลำดับสำหรับ URI ข้อมูลที่รวมอยู่ใน Intent แอปอื่นๆ จะได้รับสิทธิ์เหล่านี้สำหรับ URI ที่เฉพาะเจาะจง โดยไม่คำนึงว่าแอปมีสิทธิ์เข้าถึงข้อมูลในผู้ให้บริการเนื้อหาโดยทั่วไปหรือไม่

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

อีกสิ่งหนึ่งที่ต้องพิจารณาคือระดับการเข้าถึงแอป หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป ระบบจะทำให้แอปบางแอปแสดงให้แอปของคุณเห็นโดยอัตโนมัติและซ่อนแอปอื่นๆ โดยค่าเริ่มต้น หากแอปมีผู้ให้บริการเนื้อหาและได้ให้สิทธิ์ URI แก่แอปอื่น แอปของคุณจะแสดงโดยอัตโนมัติแก่แอปอื่นนั้น

ดูข้อมูลเพิ่มเติมได้ที่เอกสารอ้างอิงสำหรับวิธี grantUriPermission(), revokeUriPermission() และ checkUriPermission()

จำกัดการโต้ตอบกับ Broadcast Receiver ของแอป

ใช้แอตทริบิวต์ android:permission กับแท็ก <receiver> เพื่อจำกัดแอปอื่นๆ ที่ส่งการออกอากาศไปยัง BroadcastReceiver ที่เชื่อมโยงได้ ระบบจะตรวจสอบสิทธิ์หลังจาก Context.sendBroadcast() แสดงผลแล้ว เนื่องจากระบบพยายามนำส่งการออกอากาศที่ส่งไปยังผู้รับที่ระบุ ซึ่งหมายความว่าการปฏิเสธสิทธิ์จะไม่ส่งผลให้มีการยกเว้นส่งกลับไปยังผู้เรียกใช้ แต่จะไม่มีการนําส่ง Intent

ในทํานองเดียวกัน คุณสามารถให้สิทธิ์แก่ Context.registerReceiver() เพื่อควบคุมว่าแอปอื่นๆ แอปใดบ้างที่ออกอากาศไปยังตัวรับที่ลงทะเบียนแบบเป็นโปรแกรมได้ หรือในทางกลับกัน คุณสามารถระบุสิทธิ์เมื่อเรียกใช้ Context.sendBroadcast() เพื่อจำกัดตัวรับการออกอากาศที่รับการออกอากาศได้

โปรดทราบว่าทั้งผู้รับและผู้ออกอากาศอาจต้องขอสิทธิ์ ในกรณีนี้ การตรวจสอบสิทธิ์ทั้ง 2 รายการต้องผ่านเพื่อให้ส่งความตั้งใจไปยังเป้าหมายที่เกี่ยวข้องได้ ดูข้อมูลเพิ่มเติมได้ที่การจำกัดการออกอากาศด้วยสิทธิ์