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

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

หน้าจอ "สิทธิ์เข้าถึงพิเศษของแอป" ในการตั้งค่าระบบ Android ซึ่งแสดงรายการแอปและสถานะสิทธิ์พิเศษของแอป
รูปที่ 1 หน้าจอสิทธิ์เข้าถึงพิเศษของแอป ในการตั้งค่าระบบ

ตัวอย่างสิทธิ์พิเศษมีดังนี้

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

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

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

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

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

ขอสิทธิ์ในบริบท

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

อธิบายคำขอ

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