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
- เมธอด
getLine1Number()
ทั้งในคลาสTelephonyManager
และคลาสTelecomManager
- วิธีการ
getMsisdn()
ที่ไม่รองรับในคลาสTelephonyManager
หากแอปประกาศ READ_PHONE_STATE
เพื่อเรียกใช้เมธอดอื่นนอกเหนือจากที่อยู่ในรายการก่อนหน้า คุณจะขอ READ_PHONE_STATE
ต่อไปได้ใน Android ทุกเวอร์ชัน อย่างไรก็ตาม หากคุณใช้สิทธิ์ READ_PHONE_STATE
กับเมธอดในรายการก่อนหน้าเท่านั้น ให้อัปเดตไฟล์ Manifest ดังนี้
- เปลี่ยนการประกาศ
READ_PHONE_STATE
เพื่อให้แอปใช้สิทธิ์ดังกล่าวใน Android 10 (API ระดับ 29) และต่ำกว่าเท่านั้น - เพิ่มสิทธิ์
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