Thông tin cập nhật về quyền trong Android 11

Android 11 cho phép người dùng chỉ định các quyền chi tiết hơn về thông tin vị trí, micrô và máy ảnh. Ngoài ra, hệ thống sẽ đặt lại quyền cho các ứng dụng không dùng đến và nhắm đến Android 11 trở lên, và các ứng dụng có thể cần phải cập nhật các quyền mà ứng dụng khai báo nếu sử dụng cửa sổ cảnh báo hệ thống hoặc đọc thông tin liên quan đến số điện thoại.

Cấp quyền một lần

Kể từ Android 11, bất cứ khi nào ứng dụng của bạn yêu cầu cấp quyền liên quan đến vị trí, micrô hoặc camera, hộp thoại cấp quyền mà người dùng nhìn thấy sẽ chứa một tuỳ chọn có tên là Chỉ lần này. Nếu người dùng chọn tuỳ chọn này trong hộp thoại, thì ứng dụng của bạn sẽ tạm thời được cấp quyền một lần.

Tìm hiểu thêm về cách hệ thống xử lý quyền một lần.

Tự động đặt lại quyền cho các ứng dụng không dùng đến

Nếu ứng dụng của bạn nhắm đến Android 11 trở lên và không được dùng trong một vài tháng, thì hệ thống sẽ bảo vệ dữ liệu người dùng bằng cách tự động đặt lại các quyền nhạy cảm khi bắt đầu chạy mà người dùng đã cấp cho ứng dụng. Thao tác này có cùng tác dụng như khi người dùng xem một quyền trong phần cài đặt hệ thống và thay đổi cấp truy cập của ứng dụng thành Từ chối. Nếu ứng dụng của bạn làm theo các phương pháp hay nhất để yêu cầu quyền trong thời gian chạy, thì bạn không cần phải thực hiện bất kỳ thay đổi nào đối với ứng dụng. Nguyên nhân là do người dùng tương tác với các tính năng trong ứng dụng, bạn nên xác minh rằng các tính năng có những quyền cần thiết.

Tìm hiểu thêm về cách hệ thống tự động đặt lại quyền cho các ứng dụng không dùng đến.

Chế độ hiển thị hộp thoại cấp quyền

Kể từ Android 11, nếu người dùng nhấn nhiều lần vào Từ chối đối với một quyền cụ thể trong suốt thời gian cài đặt ứng dụng trên một thiết bị, thì người dùng sẽ không thấy hộp thoại cấp quyền của hệ thống nếu ứng dụng của bạn yêu cầu cấp lại quyền đó. Hành động của người dùng ngụ ý "không hỏi lại". Trên các phiên bản trước, người dùng sẽ thấy hộp thoại cấp quyền của hệ thống mỗi khi ứng dụng của bạn yêu cầu cấp quyền, trừ khi trước đó người dùng đã chọn hộp đánh dấu hoặc tuỳ chọn "không hỏi lại". Sự thay đổi này về hành vi trong Android 11 không khuyến khích các yêu cầu cấp quyền mà người dùng đã chọn từ chối nhiều lần.

Để xác định xem một ứng dụng có bị từ chối cấp quyền (cho mục đích gỡ lỗi và kiểm thử) vĩnh viễn hay không, hãy sử dụng lệnh sau:

adb shell dumpsys package PACKAGE_NAME

Trong đó PACKAGE_NAME là tên gói cần kiểm tra.

Kết quả của lệnh chứa các phần như sau:

...
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]
...

Quyền truy cập đã bị người dùng từ chối một lần sẽ bị gắn cờ USER_SET. Quyền truy cập đã bị người dùng từ chối hai lần sẽ bị gắn cờ USER_FIXED.

Trong quá trình kiểm thử, bạn nên đặt lại các cờ này để đảm bảo người kiểm thử không ngạc nhiên khi hộp thoại yêu cầu không xuất hiện. Để làm việc này, hãy dùng lệnh:

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

PERMISSION_NAME là tên của quyền bạn muốn đặt lại. Để xem danh sách đầy đủ các quyền cho ứng dụng Android, hãy truy cập trang tham khảo API về quyền.

Tìm hiểu thêm về cách xử lý trường hợp từ chối cấp quyền trong ứng dụng.

Các thay đổi về cửa sổ cảnh báo hệ thống

Android 11 thực hiện một số thay đổi về cách cấp quyền SYSTEM_ALERT_WINDOW cho ứng dụng. Các thay đổi này là nhằm bảo vệ người dùng bằng cách làm cho việc cấp quyền có chủ đích hơn.

Một số ứng dụng được tự động cấp quyền SYSTEM_ALERT_WINDOW theo yêu cầu

Một số lớp ứng dụng sẽ tự động được cấp quyền SYSTEM_ALERT_WINDOW theo yêu cầu:

  • Mọi ứng dụng có ROLE_CALL_SCREENING và yêu cầu SYSTEM_ALERT_WINDOW sẽ tự động được cấp quyền. Nếu mất ROLE_CALL_SCREENING, ứng dụng sẽ mất quyền đó.

  • Bất kỳ ứng dụng nào đang chụp màn hình thông qua MediaProjection và yêu cầu SYSTEM_ALERT_WINDOW sẽ tự động được cấp quyền trừ phi người dùng từ chối một cách rõ ràng quyền truy cập vào ứng dụng. Khi dừng chụp màn hình, ứng dụng sẽ mất quyền này. Trường hợp sử dụng này chủ yếu dành cho các ứng dụng phát trực tiếp trò chơi.

Các ứng dụng này không cần phải gửi ACTION_MANAGE_OVERLAY_PERMISSION để nhận quyền SYSTEM_ALERT_WINDOW; các ứng dụng này chỉ cần yêu cầu trực tiếp SYSTEM_ALERT_WINDOW.

Ý định MANAGE_OVERLAY_PERMISSION luôn đưa người dùng đến màn hình quyền của hệ thống

Kể từ Android 11, ý định ACTION_MANAGE_OVERLAY_PERMISSION luôn đưa người dùng đến màn hình Cài đặt cấp cao nhất. Tại đây, người dùng có thể cấp hoặc thu hồi quyền SYSTEM_ALERT_WINDOW đối với ứng dụng. Mọi dữ liệu package: trong ý định đều bị bỏ qua.

Trong các phiên bản Android cũ hơn, ý định ACTION_MANAGE_OVERLAY_PERMISSION có thể chỉ định một gói, qua đó đưa người dùng đến một màn hình dành riêng cho ứng dụng để quản lý quyền. Chức năng này không được hỗ trợ kể từ Android 11. Thay vào đó, trước tiên, người dùng phải chọn ứng dụng mà họ muốn cấp hoặc thu hồi quyền. Thay đổi này là để bảo vệ người dùng bằng cách làm cho việc cấp quyền trở nên có chủ đích hơn.

Số điện thoại

Android 11 thay đổi quyền liên quan đến điện thoại mà ứng dụng dùng khi đọc số điện thoại.

Nếu ứng dụng của bạn nhắm đến Android 11 trở lên và cần truy cập vào các API số điện thoại hiển thị trong danh sách sau đây, thì bạn phải yêu cầu quyền READ_PHONE_NUMBERS thay vì quyền READ_PHONE_STATE.

Nếu ứng dụng của bạn khai báo READ_PHONE_STATE để gọi các phương thức không phải là những phương thức trong danh sách trước, thì bạn có thể tiếp tục yêu cầu READ_PHONE_STATE trên tất cả phiên bản Android. Tuy nhiên, nếu bạn chỉ sử dụng quyền READ_PHONE_STATE cho các phương thức trong danh sách trước đó, hãy cập nhật tệp kê khai như sau:

  1. Thay đổi nội dung khai báo về READ_PHONE_STATE để ứng dụng chỉ sử dụng quyền trên Android 10 (API cấp 29) trở xuống.
  2. Thêm quyền READ_PHONE_NUMBERS.

Đoạn mã khai báo tệp kê khai sau đây minh hoạ quy trình này:

<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>

Tài nguyên khác

Để biết thêm thông tin về những thay đổi đối với quyền trong Android 11, hãy xem các tài liệu sau:

Video

Phát triển dựa trên những thay đổi mới nhất về quyền riêng tư trong Android 11