การอัปเดตสิทธิ์ใน 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