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

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

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

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

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

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

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

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

  • เมธอด getLine1Number() ในทั้งคลาส TelephonyManager และคลาส TelecomManager
  • วิธีการ getMsisdn() ที่ไม่รองรับในชั้นเรียน TelephonyManager

หากแอปประกาศ 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