สิทธิ์พิเศษจะปกป้องการเข้าถึงทรัพยากรระบบที่มีความละเอียดอ่อนเป็นพิเศษหรือไม่เกี่ยวข้องกับความเป็นส่วนตัวของผู้ใช้โดยตรง สิทธิ์เหล่านี้แตกต่างจากสิทธิ์เวลาติดตั้งและสิทธิ์รันไทม์
ตัวอย่างสิทธิ์พิเศษมีดังนี้
- การตั้งเวลาสัญญาณปลุกเจาะจง
- การแสดงและการวาดทับแอปอื่นๆ
- กำลังเข้าถึงข้อมูลพื้นที่เก็บข้อมูลทั้งหมด
แอปที่ประกาศสิทธิ์พิเศษจะแสดงในหน้าการเข้าถึงแอปพิเศษในการตั้งค่าระบบ (รูปที่ 1) หากต้องการให้สิทธิ์พิเศษแก่แอป ผู้ใช้ต้องไปที่หน้าการตั้งค่า > แอป > สิทธิ์เข้าถึงพิเศษของแอป
เวิร์กโฟลว์
หากต้องการขอสิทธิ์พิเศษ ให้ทำดังนี้
- ในไฟล์ Manifest ของแอป ให้ประกาศสิทธิ์พิเศษที่แอปอาจต้องขอ
- ออกแบบประสบการณ์ของผู้ใช้ (UX) ของแอปเพื่อให้การดำเนินการที่เฉพาะเจาะจงในแอปเชื่อมโยงกับสิทธิ์พิเศษที่เฉพาะเจาะจง แจ้งให้ผู้ใช้ทราบว่าการดำเนินการใดบ้างที่อาจต้องให้ผู้ใช้ให้สิทธิ์แอปของคุณเข้าถึงข้อมูลส่วนตัวของผู้ใช้
- รอให้ผู้ใช้เรียกใช้งานหรือการดำเนินการในแอปที่ต้องเข้าถึงข้อมูลส่วนตัวที่เฉพาะเจาะจงของผู้ใช้ ในตอนนั้น แอปของคุณจะขอสิทธิ์พิเศษที่จำเป็นสำหรับการเข้าถึงข้อมูลดังกล่าวได้
- ตรวจสอบว่าผู้ใช้ได้ให้สิทธิ์พิเศษที่แอปของคุณต้องการแล้วหรือยัง ซึ่งทำได้โดยใช้ฟังก์ชันการตรวจสอบที่กำหนดเองของสิทธิ์แต่ละรายการ หากได้รับสิทธิ์ แอปของคุณจะเข้าถึงข้อมูลส่วนตัวของผู้ใช้ได้ หากไม่ ให้ลองทำขั้นตอนถัดไป หมายเหตุ: คุณต้องตรวจสอบว่าคุณมีสิทธิ์หรือไม่ทุกครั้งที่ดำเนินการที่ต้องใช้สิทธิ์นั้น
- แสดงเหตุผลต่อผู้ใช้ในองค์ประกอบ UI ที่อธิบายอย่างชัดเจนว่าแอปพยายามเข้าถึงข้อมูลใดและแอปจะให้ประโยชน์อะไรแก่ผู้ใช้หากผู้ใช้ให้สิทธิ์พิเศษ นอกจากนี้ เนื่องจากแอปของคุณส่งผู้ใช้ไปยังการตั้งค่าระบบเพื่อให้สิทธิ์ โปรดใส่คำแนะนำสั้นๆ ที่อธิบายวิธีที่ผู้ใช้จะให้สิทธิ์ในการตั้งค่าระบบด้วย UI ของเหตุผลควรมีตัวเลือกที่ชัดเจนให้ผู้ใช้เลือกไม่ให้สิทธิ์ หลังจากผู้ใช้รับทราบเหตุผลแล้ว ให้ไปยังขั้นตอนถัดไป
- ขอสิทธิ์พิเศษที่แอปของคุณต้องใช้เพื่อเข้าถึงข้อมูลส่วนตัวของผู้ใช้ ซึ่งน่าจะเกี่ยวข้องกับ Intent ไปยังหน้าที่เกี่ยวข้องในการตั้งค่าระบบที่ผู้ใช้สามารถให้สิทธิ์ได้ ซึ่งต่างจากสิทธิ์รันไทม์ตรงที่จะไม่มีกล่องโต้ตอบสิทธิ์
- ตรวจสอบการตอบสนองของผู้ใช้ว่าเลือกให้หรือปฏิเสธสิทธิ์พิเศษในเมธอด
onResume() - หากผู้ใช้ให้สิทธิ์แก่แอป คุณจะเข้าถึงข้อมูลส่วนตัวของผู้ใช้ได้ หากผู้ใช้ปฏิเสธสิทธิ์ ให้ลดระดับประสบการณ์การใช้งานแอปอย่างค่อยเป็นค่อยไปเพื่อให้แอปมีฟังก์ชันการทำงานแก่ผู้ใช้โดยไม่มีข้อมูลที่ได้รับการปกป้องโดยสิทธิ์นั้น
ขอสิทธิ์พิเศษ
ผู้ใช้ต้องให้สิทธิ์พิเศษจากหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ ซึ่งแตกต่างจากสิทธิ์รันไทม์ แอปสามารถส่งผู้ใช้ไปยังหน้าดังกล่าวโดยใช้ Intent ซึ่งจะหยุดแอปชั่วคราวและเปิดหน้าการตั้งค่าที่เกี่ยวข้องสำหรับสิทธิ์พิเศษที่ระบุ หลังจากผู้ใช้กลับมาที่แอป แอปจะตรวจสอบได้ว่ามีการให้สิทธิ์ในฟังก์ชัน onResume() หรือไม่
โค้ดตัวอย่างต่อไปนี้แสดงวิธีขอสิทธิ์พิเศษ SCHEDULE_EXACT_ALARMS จากผู้ใช้
val alarmManager = getSystemService<AlarmManager>()!!
when {
// if permission is granted, proceed with scheduling exact alarms…
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// ask users to grant the permission in the corresponding settings page
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
โค้ดตัวอย่างเพื่อตรวจสอบสิทธิ์และจัดการการตัดสินใจของผู้ใช้ใน onResume()
override fun onResume() {
// ...
if (alarmManager.canScheduleExactAlarms()) {
// proceed with the action (setting exact alarms)
alarmManager.setExact(...)
}
else {
// permission not yet approved. Display user notice and gracefully
// degrade your app experience.
alarmManager.setWindow(...)
}
}
เคล็ดลับในการขอสิทธิ์พิเศษ
ส่วนต่อไปนี้จะให้ข้อควรพิจารณาและเคล็ดลับเมื่อขอสิทธิ์พิเศษ
สิทธิ์แต่ละรายการมีวิธีการตรวจสอบของตัวเอง
สิทธิ์พิเศษทำงานแตกต่างจากสิทธิ์รันไทม์ แต่ให้ดูหน้าเอกสารอ้างอิง API สิทธิ์และใช้ฟังก์ชันการตรวจสอบการเข้าถึงที่กำหนดเองสำหรับสิทธิ์พิเศษแต่ละรายการแทน ตัวอย่างเช่น AlarmManager#canScheduleExactAlarms() สำหรับสิทธิ์ SCHEDULE_EXACT_ALARMS และ Environment#isExternalStorageManager() สำหรับสิทธิ์ MANAGE_EXTERNAL_STORAGE
คำขอในบริบท
แอปควรขอสิทธิ์พิเศษตามบริบทเมื่อผู้ใช้ขอการดำเนินการที่เฉพาะเจาะจงซึ่งต้องใช้สิทธิ์ดังกล่าว เช่นเดียวกับสิทธิ์รันไทม์ ตัวอย่างเช่น รอขอสิทธิ์ SCHEDULE_EXACT_ALARMS จนกว่าผู้ใช้จะกำหนดเวลาส่งอีเมลในเวลาที่เจาะจง
อธิบายคำขอ
ให้เหตุผลก่อนเปลี่ยนเส้นทางไปยังการตั้งค่าระบบ เนื่องจากผู้ใช้จะออกจากแอปชั่วคราวเพื่อให้สิทธิ์พิเศษ คุณจึงควรแสดง UI ในแอปก่อนที่จะเปิด Intent ไปยังหน้าการเข้าถึงแอปพิเศษในการตั้งค่าระบบ UI นี้ควรอธิบายอย่างชัดเจนว่าเหตุใดแอปจึงต้องใช้สิทธิ์และผู้ใช้ควรให้สิทธิ์อย่างไรในหน้าการตั้งค่า