จำกัดการโต้ตอบกับแอปอื่นๆ (original) (raw)
สิทธิ์ไม่ได้มีไว้สำหรับขอฟังก์ชันการทำงานของระบบเท่านั้น นอกจากนี้ คุณยัง จำกัดวิธีที่แอปอื่นๆ โต้ตอบกับคอมโพเนนต์ของแอปได้ด้วย
คู่มือนี้อธิบายวิธีตรวจสอบชุดสิทธิ์ที่แอปอื่นประกาศ นอกจากนี้ คู่มือยังอธิบายวิธีกำหนดค่ากิจกรรม บริการ ผู้ให้บริการเนื้อหา และเครื่องรับการออกอากาศเพื่อจำกัดวิธีที่แอปอื่นๆ สามารถ โต้ตอบกับแอปของคุณ
ตรวจสอบสิทธิ์ของแอปอื่น
หากต้องการดูชุดสิทธิ์ที่แอปอื่นประกาศ ให้ใช้อุปกรณ์หรือ โปรแกรมจำลองเพื่อทำตามขั้นตอนต่อไปนี้
- เปิดหน้าจอข้อมูลแอปของแอป
- เลือกสิทธิ์ หน้าจอสิทธิ์ของแอปจะโหลดขึ้นมา
หน้าจอนี้แสดงชุดกลุ่มสิทธิ์ ระบบจะจัดชุด สิทธิ์ที่แอปประกาศไว้เป็นกลุ่มเหล่านี้
คุณตรวจสอบสิทธิ์ด้วยวิธีอื่นๆ ที่มีประโยชน์ได้ดังนี้
- หากต้องการตรวจสอบสิทธิ์ขณะโทรเข้าบริการ ให้ส่งสตริงสิทธิ์ ไปยัง Context.checkCallingPermission() เมธอดนี้จะแสดงผลจำนวนเต็ม ซึ่งระบุว่ากระบวนการเรียกใช้ปัจจุบัน ได้รับสิทธิ์ดังกล่าวหรือไม่ โปรดทราบว่าคุณจะใช้ฟังก์ชันนี้ได้ก็ต่อเมื่อเรียกใช้ การเรียกที่มาจากกระบวนการอื่น ซึ่งมักจะผ่านอินเทอร์เฟซ IDL ที่เผยแพร่จากบริการหรือในลักษณะอื่นๆ ที่ส่งไปยังกระบวนการอื่น
- หากต้องการตรวจสอบว่ากระบวนการอื่นได้รับสิทธิ์ใดสิทธิ์หนึ่งหรือไม่ ให้ส่งรหัสกระบวนการ (PID) ไปยัง Context.checkPermission()
- หากต้องการตรวจสอบว่าแพ็กเกจอื่นได้รับสิทธิ์ใดสิทธิ์หนึ่งหรือไม่ ให้ส่งชื่อแพ็กเกจไปยัง PackageManager.checkPermission()
จำกัดการโต้ตอบกับกิจกรรมของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ android:permission ของแท็ก เพื่อจำกัดแอปอื่นๆ ที่สามารถเริ่ม Activity นั้น ระบบจะตรวจสอบ สิทธิ์ระหว่างContext.startActivity()และActivity.startActivityForResult() หากผู้โทรไม่มี สิทธิ์ที่จำเป็น ระบบจะแสดงSecurityException
จำกัดการโต้ตอบกับบริการของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ android:permission ของแท็ก เพื่อจำกัดแอปอื่นๆ ที่สามารถเริ่มต้นหรือเชื่อมโยงกับ Service ที่เชื่อมโยง ระบบจะตรวจสอบสิทธิ์ในระหว่างContext.startService() Context.stopService() และContext.bindService() หากผู้โทรไม่มีสิทธิ์ที่จำเป็น ระบบจะแสดงSecurityException
จำกัดการโต้ตอบกับผู้ให้บริการเนื้อหาของแอป
ในไฟล์ Manifest ให้ใช้แอตทริบิวต์ android:permission ของแท็ก เพื่อจำกัดแอปอื่นๆ ที่เข้าถึงข้อมูลใน ContentProvider ได้ (ผู้ให้บริการเนื้อหามีเครื่องมือรักษาความปลอดภัยเพิ่มเติมที่สำคัญซึ่งเรียกว่าสิทธิ์ URI ซึ่งอธิบายไว้ในส่วนถัดไป) คุณตั้งค่าแอตทริบิวต์สิทธิ์ 2 รายการแยกกันสำหรับผู้ให้บริการเนื้อหาได้ ซึ่งต่างจากคอมโพเนนต์อื่นๆ โดย android:readPermission จะจำกัด แอปอื่นๆ ที่อ่านจากผู้ให้บริการได้ และ android:writePermission จะจำกัด แอปอื่นๆ ที่เขียนไปยังผู้ให้บริการได้ โปรดทราบว่าหากผู้ให้บริการได้รับการปกป้อง ด้วยทั้งสิทธิ์อ่านและสิทธิ์เขียน การมีเพียงสิทธิ์เขียนจะไม่ อนุญาตให้แอปอ่านจากผู้ให้บริการ
ระบบจะตรวจสอบสิทธิ์เมื่อดึงข้อมูลผู้ให้บริการเป็นครั้งแรกและเมื่อแอป ดำเนินการกับผู้ให้บริการ หากแอปที่ขอไม่มีสิทธิ์ใดสิทธิ์หนึ่ง จะเกิด SecurityException การใช้ ContentResolver.query() ต้องมีสิทธิ์อ่าน ส่วนการใช้ ContentResolver.insert() ContentResolver.update() หรือ ContentResolver.delete() ต้องมีสิทธิ์เขียน ในกรณีทั้งหมดนี้ การไม่มีสิทธิ์ที่จำเป็น จะส่งผลให้เกิดSecurityException
ให้สิทธิ์เข้าถึงเป็นราย URI
ระบบจะช่วยให้คุณควบคุมวิธีที่แอปอื่นๆ เข้าถึงผู้ให้บริการเนื้อหาของแอปได้อย่างละเอียดมากขึ้น โดยเฉพาะอย่างยิ่ง ผู้ให้บริการเนื้อหา สามารถปกป้องตัวเองด้วยสิทธิ์อ่านและเขียนในขณะที่ยังอนุญาตให้ ไคลเอ็นต์โดยตรงแชร์ URI ที่เฉพาะเจาะจงกับแอปอื่นๆ ได้ หากต้องการประกาศการรองรับโมเดลนี้ของแอป ให้ใช้แอตทริบิวต์ android:grantUriPermissions หรือ องค์ประกอบ
นอกจากนี้ คุณยังให้สิทธิ์ตาม 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 ของแท็ก เพื่อ จำกัดแอปอื่นๆ ที่สามารถส่งการออกอากาศไปยัง BroadcastReceiver ที่เชื่อมโยง ระบบจะตรวจสอบสิทธิ์หลังจาก Context.sendBroadcast() แสดงผล เนื่องจากระบบพยายามส่งการออกอากาศที่ส่งมาไปยังผู้รับที่ระบุ ซึ่งหมายความว่าการให้สิทธิ์ ไม่สำเร็จจะไม่ทำให้ระบบส่งข้อยกเว้นกลับไปยังผู้เรียก แต่จะ ไม่ส่ง Intent
นอกจากนี้ คุณยังกำหนดค่าสิทธิ์แบบเป็นโปรแกรมได้ด้วย โดยทำดังนี้
- หากต้องการควบคุมว่าแอปอื่นๆ ใดบ้างที่สามารถออกอากาศไปยังตัวรับที่ลงทะเบียนโดยใช้โปรแกรม ให้ระบุสิทธิ์ไปยังContext.registerReceiver()
- หากต้องการจำกัดตัวรับสัญญาณที่รับการออกอากาศได้ ให้ระบุสิทธิ์เมื่อเรียกใช้ Context.sendBroadcast()
โปรดทราบว่าทั้งผู้รับและผู้แพร่ภาพสามารถกำหนดให้ต้องมีสิทธิ์ได้ ในกรณีนี้ การตรวจสอบสิทธิ์ทั้ง 2 รายการต้องผ่านเพื่อให้ระบบส่ง Intent ไปยังเป้าหมายที่เชื่อมโยง ดูข้อมูลเพิ่มเติมได้ที่การจำกัดการออกอากาศด้วยสิทธิ์