การอัปเดตสิทธิ์ใน Android 11

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

สิทธิ์แบบครั้งเดียว

ตั้งแต่ Android 11 เป็นต้นไป เมื่อใดก็ตามที่แอปขอสิทธิ์ที่เกี่ยวข้องกับตำแหน่ง ไมโครโฟน หรือกล้อง กล่องโต้ตอบสิทธิ์ที่แสดงต่อผู้ใช้จะมีตัวเลือกชื่อเฉพาะครั้งนี้ หากผู้ใช้เลือกตัวเลือกนี้ในกล่องโต้ตอบ แอปของคุณจะได้รับสิทธิ์แบบครั้งเดียวชั่วคราว

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ระบบจัดการสิทธิ์แบบครั้งเดียว

รีเซ็ตสิทธิ์อัตโนมัติจากแอปที่ไม่ได้ใช้

หากแอปกำหนดเป้าหมายเป็น Android 11 ขึ้นไปและไม่ได้ใช้งานเป็นเวลา 2-3 เดือน ระบบจะปกป้องข้อมูลผู้ใช้โดยรีเซ็ตสิทธิ์รันไทม์ที่มีความละเอียดอ่อนซึ่งผู้ใช้ให้สิทธิ์แอปโดยอัตโนมัติ การดำเนินการนี้จะมีผลเหมือนกับที่ผู้ใช้ดูสิทธิ์ในการตั้งค่าระบบและเปลี่ยนระดับการเข้าถึงของแอปเป็นปฏิเสธ หากแอปเป็นไปตามแนวทางปฏิบัติแนะนำสำหรับการขอสิทธิ์ที่รันไทม์ คุณก็ไม่จำเป็นต้องเปลี่ยนแปลงแอปใดๆ เนื่องจากเมื่อผู้ใช้โต้ตอบกับฟีเจอร์ในแอป คุณควรยืนยันว่าฟีเจอร์เหล่านั้นมีสิทธิ์ที่จำเป็น

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ระบบรีเซ็ตสิทธิ์ของแอปที่ไม่ได้ใช้โดยอัตโนมัติ

ระดับการเข้าถึงกล่องโต้ตอบสิทธิ์

ตั้งแต่ Android 11 เป็นต้นไป หากผู้ใช้แตะปฏิเสธสิทธิ์ใดสิทธิ์หนึ่งมากกว่า 1 ครั้งตลอดอายุการติดตั้งแอปในอุปกรณ์ ผู้ใช้จะไม่เห็นกล่องโต้ตอบสิทธิ์ของระบบหากแอปขอสิทธิ์นั้นอีกครั้ง การดำเนินการของผู้ใช้จะถือว่า "ไม่ต้องถามอีก" ในเวอร์ชันก่อนหน้านี้ ผู้ใช้จะเห็นกล่องโต้ตอบสิทธิ์ของระบบทุกครั้งที่แอปขอสิทธิ์ เว้นแต่ผู้ใช้จะเลือกช่องทำเครื่องหมายหรือตัวเลือก "ไม่ต้องถามอีก" ไว้ก่อนหน้านี้ การเปลี่ยนแปลงลักษณะการทำงานนี้ใน Android 11 จะช่วยยับยั้งคำขอสิทธิ์ซ้ำๆ ที่ผู้ใช้เลือกปฏิเสธ

หากต้องการระบุว่าแอปถูกปฏิเสธสิทธิ์อย่างถาวรหรือไม่ (เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องและการทดสอบ) ให้ใช้คําสั่งต่อไปนี้

adb shell dumpsys package PACKAGE_NAME

โดยที่ PACKAGE_NAME คือชื่อแพ็กเกจที่จะตรวจสอบ

เอาต์พุตของคำสั่งมีส่วนที่มีลักษณะเช่นนี้

...
runtime permissions:
  android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
...

สิทธิ์ที่ผู้ใช้ปฏิเสธ 1 ครั้งจะมีการแจ้งว่าไม่เหมาะสมโดย USER_SET สิทธิ์ที่ถูกปฏิเสธอย่างถาวรโดยการเลือกปฏิเสธ 2 ครั้งจะได้รับการแจ้งว่าไม่อนุญาตโดย USER_FIXED

ในระหว่างการทดสอบ คุณอาจต้องรีเซ็ต Flag เหล่านี้เพื่อให้ผู้ทดสอบไม่แปลกใจเมื่อกล่องโต้ตอบคำขอไม่แสดง โดยใช้คำสั่งต่อไปนี้

adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed

PERMISSION_NAME คือชื่อสิทธิ์ที่คุณต้องการรีเซ็ต หากต้องการดูรายการสิทธิ์ทั้งหมดของแอป Android โปรดไปที่หน้าอ้างอิง API สิทธิ์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการการปฏิเสธสิทธิ์ในแอป

การเปลี่ยนแปลงหน้าต่างแจ้งเตือนของระบบ

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

แอปบางแอปจะได้รับสิทธิ์ SYSTEM_ALERT_WINDOW โดยอัตโนมัติเมื่อมีการขอ

แอปบางประเภทจะได้รับสิทธิ์ SYSTEM_ALERT_WINDOW โดยอัตโนมัติเมื่อมีการส่งคำขอ

  • แอปที่มี ROLE_CALL_SCREENING และขอ SYSTEM_ALERT_WINDOW จะได้รับสิทธิ์โดยอัตโนมัติ หากแอปเสียROLE_CALL_SCREENING ก็จะเสียสิทธิ์

  • แอปที่กำลังจับภาพหน้าจอผ่าน MediaProjection และส่งคำขอ SYSTEM_ALERT_WINDOW จะได้รับสิทธิ์โดยอัตโนมัติ เว้นแต่ผู้ใช้ได้ปฏิเสธสิทธิ์ของแอปอย่างชัดแจ้ง เมื่อแอปหยุดการจับภาพหน้าจอแล้ว แอปจะสูญเสียสิทธิ์ดังกล่าว กรณีการใช้งานนี้มีไว้สำหรับแอป ที่สตรีมเกมแบบสดเป็นหลัก

แอปเหล่านี้ไม่จำเป็นต้องส่ง ACTION_MANAGE_OVERLAY_PERMISSION เพื่อขอรับสิทธิ์ SYSTEM_ALERT_WINDOW เนื่องจากแอปจะขอ SYSTEM_ALERT_WINDOW ได้โดยตรง

MANAGE_OVERLAY_PERMISSION จะนำผู้ใช้ไปยังหน้าจอสิทธิ์ของระบบเสมอ

ใน Android 11 เป็นต้นไป ACTION_MANAGE_OVERLAY_PERMISSION ความตั้งใจจะนำผู้ใช้ไปยังหน้าจอการตั้งค่าระดับบนสุดเสมอ ซึ่งผู้ใช้สามารถอนุญาตหรือเพิกถอนสิทธิ์ SYSTEM_ALERT_WINDOW สำหรับแอปได้ ระบบจะไม่สนใจข้อมูล package: ใน Intent

ใน Android เวอร์ชันก่อนหน้า Intent ของ ACTION_MANAGE_OVERLAY_PERMISSION สามารถระบุแพ็กเกจ ซึ่งจะนำผู้ใช้ไปยังหน้าจอเฉพาะของแอปเพื่อจัดการสิทธิ์ ระบบไม่รองรับฟังก์ชันการทำงานนี้ใน Android 11 แต่ผู้ใช้ต้องเลือกแอปที่ต้องการให้หรือเพิกถอนสิทธิ์ก่อน การเปลี่ยนแปลงนี้มีจุดประสงค์เพื่อปกป้องผู้ใช้ ด้วยการทำให้การอนุญาตเป็นไปอย่างตั้งใจมากขึ้น

หมายเลขโทรศัพท์

Android 11 เปลี่ยนสิทธิ์เกี่ยวกับโทรศัพท์ที่แอปใช้เมื่ออ่านหมายเลขโทรศัพท์

หากแอปกำหนดเป้าหมายเป็น Android 11 ขึ้นไปและจำเป็นต้องเข้าถึง API หมายเลขโทรศัพท์ที่แสดงในรายการต่อไปนี้ คุณต้องขอสิทธิ์ READ_PHONE_NUMBERS แทนสิทธิ์ READ_PHONE_STATE

หากแอปประกาศให้ใช้ READ_PHONE_STATE เพื่อเรียกเมธอดที่นอกเหนือจากวิธีการในรายการก่อนหน้า คุณจะขอ READ_PHONE_STATE ใน Android ทุกเวอร์ชันต่อไปได้ แต่หากใช้สิทธิ์ READ_PHONE_STATE เฉพาะสำหรับวิธีในรายการก่อนหน้า ให้อัปเดตไฟล์ Manifest ดังนี้

  1. เปลี่ยนการประกาศ READ_PHONE_STATE เพื่อให้แอปใช้สิทธิ์เฉพาะใน Android 10 (API ระดับ 29) และต่ำกว่าเท่านั้น
  2. เพิ่มสิทธิ์ READ_PHONE_NUMBERS

ข้อมูลโค้ดการประกาศไฟล์ Manifest ต่อไปนี้แสดงกระบวนการนี้

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงสิทธิ์ใน Android 11 ได้ที่เนื้อหาต่อไปนี้

วิดีโอ

การพัฒนาด้วยการเปลี่ยนแปลงด้านความเป็นส่วนตัวล่าสุดใน Android 11