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