ขอสิทธิ์พิเศษ

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

รูปที่ 1: หน้าจอการเข้าถึงแอปพิเศษในการตั้งค่าระบบ

ตัวอย่างของสิทธิ์พิเศษ ได้แก่

  • การตั้งเวลาการปลุกในเวลาที่แน่นอน
  • การแสดงและวาดทับแอปอื่นๆ
  • การเข้าถึงข้อมูลพื้นที่เก็บข้อมูลทั้งหมด

แอปที่ประกาศสิทธิ์พิเศษจะแสดงในหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ (รูปที่ 1) หากต้องการให้สิทธิ์พิเศษแก่แอป ผู้ใช้ต้องไปที่หน้านี้ การตั้งค่า > แอป > สิทธิ์เข้าถึงพิเศษของแอป

ขั้นตอนการทำงาน

หากต้องการขอสิทธิ์พิเศษ ให้ทำดังนี้

  1. ในไฟล์ Manifest ของแอป ให้ประกาศสิทธิ์พิเศษที่แอปอาจต้องขอ
  2. ออกแบบ UX ของแอปเพื่อให้การดําเนินการบางอย่างในแอปเชื่อมโยงกับสิทธิ์พิเศษที่เฉพาะเจาะจง แจ้งให้ผู้ใช้ทราบว่าการดำเนินการใดบ้างที่อาจทำให้ต้องให้สิทธิ์แก่แอปในการเข้าถึงข้อมูลส่วนตัวของผู้ใช้
  3. รอให้ผู้ใช้เรียกใช้งานหรือการดำเนินการในแอปที่จำเป็นต้องเข้าถึงข้อมูลส่วนตัวที่เฉพาะเจาะจงของผู้ใช้ ในเวลาดังกล่าว แอปจะขอสิทธิ์พิเศษที่จําเป็นสําหรับการเข้าถึงข้อมูลนั้นได้
  4. ตรวจสอบว่าผู้ใช้ได้ให้สิทธิ์พิเศษที่แอปของคุณจําเป็นแล้วหรือยัง โดยให้ใช้ฟังก์ชันการตรวจสอบที่กำหนดเองของสิทธิ์แต่ละรายการ หากได้รับสิทธิ์ แอปของคุณจะเข้าถึงข้อมูลส่วนตัวของผู้ใช้ได้ หากไม่ ให้ไปยังขั้นตอนถัดไป หมายเหตุ: คุณต้องตรวจสอบว่าคุณมีสิทธิ์ทุกครั้งที่ดำเนินการซึ่งต้องใช้สิทธิ์ดังกล่าว
  5. แสดงเหตุผลให้ผู้ใช้ทราบในองค์ประกอบ UI ที่อธิบายอย่างชัดเจนว่าแอปพยายามเข้าถึงข้อมูลใดและประโยชน์ที่แอปมอบให้ผู้ใช้หากผู้ใช้ให้สิทธิ์พิเศษ นอกจากนี้ เนื่องจากแอปของคุณส่งผู้ใช้ไปยังการตั้งค่าระบบเพื่อให้สิทธิ์ ให้ใส่วิธีการสั้นๆ ที่อธิบายวิธีที่ผู้ใช้สามารถให้สิทธิ์ในนั้นด้วย UI เหตุผลควรมีตัวเลือกที่ชัดเจนให้ผู้ใช้เลือกไม่ให้สิทธิ์ หลังจากผู้ใช้รับทราบเหตุผลแล้ว ให้ไปยังขั้นตอนถัดไป
  6. ขอสิทธิ์พิเศษที่แอปของคุณต้องใช้เพื่อเข้าถึงข้อมูลส่วนตัวของผู้ใช้ ซึ่งอาจเกี่ยวข้องกับความตั้งใจที่จะไปยังหน้าที่เกี่ยวข้องในการตั้งค่าระบบที่ผู้ใช้สามารถให้สิทธิ์ได้ ซึ่งแตกต่างจากสิทธิ์รันไทม์ตรงที่ไม่มีกล่องโต้ตอบสิทธิ์แบบป๊อปอัป
  7. ตรวจสอบคําตอบของผู้ใช้ว่าเลือกให้สิทธิ์หรือปฏิเสธสิทธิ์พิเศษในเมธอด onResume()
  8. หากผู้ใช้ให้สิทธิ์แก่แอปของคุณ คุณจะเข้าถึงข้อมูลส่วนตัวของผู้ใช้ได้ หากผู้ใช้ปฏิเสธสิทธิ์ ให้ลดระดับประสบการณ์การใช้งานแอปอย่างค่อยเป็นค่อยไปเพื่อให้แอปทำงานได้โดยไม่ต้องใช้ข้อมูลที่ได้รับความคุ้มครองจากสิทธิ์นั้น
รูปที่ 2: เวิร์กโฟลว์สำหรับการประกาศและขอสิทธิ์พิเศษใน Android

ขอสิทธิ์พิเศษ

ซึ่งแตกต่างจากสิทธิ์รันไทม์ตรงที่ผู้ใช้ต้องให้สิทธิ์พิเศษจากหน้าสิทธิ์เข้าถึงพิเศษของแอปในการตั้งค่าระบบ แอปสามารถส่งผู้ใช้ไปยังหน้าดังกล่าวได้โดยใช้ 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 permission และ Environment#isExternalStorageManager() สำหรับขอMANAGE_EXTERNAL_STORAGE permission

คำขอในบริบท

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

อธิบายคำขอ

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