สิทธิ์ไม่ได้มีไว้สำหรับขอฟังก์ชันการทำงานของระบบเท่านั้น นอกจากนี้ คุณยัง จำกัดวิธีที่แอปอื่นๆ โต้ตอบกับคอมโพเนนต์ของแอปได้ด้วย
คู่มือนี้อธิบายวิธีตรวจสอบชุดสิทธิ์ที่แอปอื่นประกาศ นอกจากนี้ คู่มือยังอธิบายวิธีกำหนดค่ากิจกรรม บริการ ผู้ให้บริการเนื้อหา และเครื่องรับการออกอากาศเพื่อจำกัดวิธีที่แอปอื่นๆ สามารถ โต้ตอบกับแอปของคุณ
ตรวจสอบสิทธิ์ของแอปอื่น
หากต้องการดูชุดสิทธิ์ที่แอปอื่นประกาศ ให้ใช้อุปกรณ์หรือ โปรแกรมจำลองเพื่อทำตามขั้นตอนต่อไปนี้
- เปิดหน้าจอข้อมูลแอปของแอป
เลือกสิทธิ์ หน้าจอสิทธิ์ของแอปจะโหลดขึ้นมา
หน้าจอนี้แสดงชุดกลุ่มสิทธิ์ ระบบจะจัดชุด สิทธิ์ที่แอปประกาศไว้เป็นกลุ่มเหล่านี้
คุณตรวจสอบสิทธิ์ด้วยวิธีอื่นๆ ที่มีประโยชน์ได้ดังนี้
- หากต้องการตรวจสอบสิทธิ์ขณะโทรเข้าบริการ ให้ส่งสตริงสิทธิ์
ไปยัง
Context.checkCallingPermission()เมธอดนี้จะแสดงผลจำนวนเต็ม ซึ่งระบุว่ากระบวนการเรียกใช้ปัจจุบัน ได้รับสิทธิ์ดังกล่าวหรือไม่ โปรดทราบว่าคุณจะใช้ฟังก์ชันนี้ได้ก็ต่อเมื่อเรียกใช้ การเรียกที่มาจากกระบวนการอื่น ซึ่งมักจะผ่านอินเทอร์เฟซ IDL ที่เผยแพร่จากบริการหรือในลักษณะอื่นๆ ที่ส่งไปยังกระบวนการอื่น - หากต้องการตรวจสอบว่ากระบวนการอื่นได้รับสิทธิ์ใดสิทธิ์หนึ่งหรือไม่ ให้ส่งรหัสกระบวนการ (PID) ไปยัง
Context.checkPermission() - หากต้องการตรวจสอบว่าแพ็กเกจอื่นได้รับสิทธิ์ใดสิทธิ์หนึ่งหรือไม่
ให้ส่งชื่อแพ็กเกจไปยัง
PackageManager.checkPermission()
จำกัดการโต้ตอบกับกิจกรรมของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ android:permission ของแท็ก <activity>
เพื่อจำกัดแอปอื่นๆ ที่สามารถเริ่ม Activity นั้น ระบบจะตรวจสอบ
สิทธิ์ระหว่างContext.startActivity()และ
Activity.startActivityForResult() หากผู้โทรไม่มี
สิทธิ์ที่จำเป็น ระบบจะแสดงSecurityException
จำกัดการโต้ตอบกับบริการของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ android:permission ของแท็ก <service>
เพื่อจำกัดแอปอื่นๆ ที่สามารถเริ่มต้นหรือเชื่อมโยงกับ Service ที่เชื่อมโยง
ระบบจะตรวจสอบสิทธิ์ในระหว่างContext.startService() Context.stopService() และContext.bindService() หากผู้โทรไม่มีสิทธิ์ที่จำเป็น
ระบบจะแสดงSecurityException
จำกัดการโต้ตอบกับผู้ให้บริการเนื้อหาของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ 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 ได้ด้วย เมื่อเริ่มกิจกรรมหรือส่งผลลัพธ์กลับไปยังกิจกรรม ให้ตั้งค่าแฟล็ก Intent Intent.FLAG_GRANT_READ_URI_PERMISSION, แฟล็ก Intent Intent.FLAG_GRANT_WRITE_URI_PERMISSION หรือทั้ง 2 แฟล็ก ซึ่งจะให้สิทธิ์อ่าน เขียน หรืออ่านและเขียนตามลำดับแก่แอปอื่นๆ สำหรับ
URI ข้อมูลที่รวมอยู่ใน Intent แอปอื่นๆ จะได้รับสิทธิ์เหล่านี้
สำหรับ URI ที่เฉพาะเจาะจง ไม่ว่าแอปจะมีสิทธิ์เข้าถึงข้อมูล
ในผู้ให้บริการเนื้อหาโดยทั่วไปหรือไม่ก็ตาม
เช่น สมมติว่าผู้ใช้ใช้แอปของคุณเพื่อดูอีเมลที่มี
ไฟล์แนบเป็นรูปภาพ โดยทั่วไปแล้ว แอปอื่นๆ ไม่ควรเข้าถึงเนื้อหาอีเมลได้ แต่แอปอาจสนใจดูรูปภาพ แอปของคุณสามารถใช้
Intent และIntent.FLAG_GRANT_READ_URI_PERMISSIONแฟล็ก Intent เพื่อให้แอป
ดูรูปภาพเห็นรูปภาพได้
อีกสิ่งที่ควรพิจารณาคือระดับการมองเห็นแอป หากแอปกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป ระบบจะทำให้แอปบางแอปมองเห็นได้ในแอปของคุณ โดยอัตโนมัติ และซ่อนแอปอื่นๆ โดยค่าเริ่มต้น หากแอปมี Content Provider และได้ให้สิทธิ์ URI แก่แอปอื่น แอปของคุณจะมองเห็นได้โดยอัตโนมัติในแอปอื่นนั้น
ดูข้อมูลเพิ่มเติมได้ที่เอกสารอ้างอิงสำหรับเมธอด
grantUriPermission(), revokeUriPermission() และ
checkUriPermission()
จำกัดการโต้ตอบกับ Broadcast Receiver ของแอป
ใช้แอตทริบิวต์ android:permission ของแท็ก <receiver> เพื่อ
จำกัดแอปอื่นๆ ที่สามารถส่งการออกอากาศไปยัง BroadcastReceiver ที่เชื่อมโยง ระบบจะตรวจสอบสิทธิ์หลังจาก
Context.sendBroadcast() แสดงผล เนื่องจากระบบพยายามส่งการออกอากาศที่ส่งมาไปยังผู้รับที่ระบุ ซึ่งหมายความว่าการให้สิทธิ์
ไม่สำเร็จจะไม่ทำให้ระบบส่งข้อยกเว้นกลับไปยังผู้เรียก แต่จะ
ไม่ส่ง Intent
นอกจากนี้ คุณยังกำหนดค่าสิทธิ์แบบเป็นโปรแกรมได้ด้วย โดยทำดังนี้
- หากต้องการควบคุมว่าแอปอื่นๆ ใดบ้างที่สามารถออกอากาศไปยังตัวรับที่ลงทะเบียนโดยใช้โปรแกรม ให้ระบุสิทธิ์ไปยัง
Context.registerReceiver() - หากต้องการจำกัดตัวรับสัญญาณที่รับการออกอากาศได้ ให้ระบุสิทธิ์เมื่อเรียกใช้
Context.sendBroadcast()
โปรดทราบว่าทั้งผู้รับและผู้แพร่ภาพสามารถกำหนดให้ต้องมีสิทธิ์ได้ ในกรณีนี้ การตรวจสอบสิทธิ์ทั้ง 2 รายการต้องผ่านเพื่อให้ระบบส่ง Intent ไปยังเป้าหมายที่เชื่อมโยง ดูข้อมูลเพิ่มเติมได้ที่ การจำกัดการออกอากาศด้วยสิทธิ์