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

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

ตั้งแต่ Android 11 เป็นต้นไป ผู้ใช้จะเข้าสู่หน้าจอการตั้งค่าระดับบนสุดเสมอเมื่อมีการเรียกใช้ Intent ซึ่งผู้ใช้สามารถให้หรือเพิกถอนสิทธิ์ SYSTEM_ALERT_WINDOW ให้กับแอปได้ACTION_MANAGE_OVERLAY_PERMISSION ระบบจะไม่สนใจข้อมูล 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