Nội dung 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 cho thông tin vị trí, micrô và máy ảnh. Ngoài ra, hệ thống sẽ đặt lại các quyền của các ứng dụng không dùng đến nhắm đến Android 11 trở lên. Các ứng dụng có thể cần cập nhật các quyền mà chú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 yêu cầu cấp quyền liên quan đến vị trí, micrô hoặc máy ảnh, hộp thoại cấp quyền mà người dùng nhìn thấy sẽ chứa 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 từ 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 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. Hành động này có tác dụng tương tự 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 tuân theo các phương pháp hay nhất để yêu cầu cấp quyền trong thời gian chạy, thì bạn không cần thực hiện thay đổi nào đối với ứng dụng. Lý do là khi 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ó các quyền mà người dùng cần.

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

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

Kể từ Android 11, nếu người dùng nhiều lần nhấn vào Từ chối với một quyền cụ thể trong suốt thời gian ứng dụng của bạn được cài đặt trên thiết bị, thì người dùng sẽ không xem 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". Thay đổi về hành vi này trong Android 11 sẽ ngăn việc yêu cầu nhiều lần các quyền mà người dùng đã chọn từ chối.

Để 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 bị bất ngờ khi hộp thoại yêu cầu không xuất hiện. Để thực hiện việc này, hãy sử 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 trên Android, hãy truy cập vào trang Tài liệu tham khảo API về quyền.

Tìm hiểu thêm về cách xử lý tình trạng từ chối cấp quyền trong ứng dụng của bạn.

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

Android 11 thực hiện một số thay đổi đối với cách cấp quyền SYSTEM_ALERT_WINDOW cho ứng dụng. Những thay đổi này nhằm bảo vệ người dùng bằng cách giúp họ cân nhắc kỹ hơn khi cấp quyền.

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

Một số loại ứng dụng nhất định sẽ tự động được cấp quyền SYSTEM_ALERT_WINDOW khi có 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.

  • Mọi ứng dụng đ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 rõ ràng quyền cho ứng dụng. Khi ứng dụng ngừ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 gửi ACTION_MANAGE_OVERLAY_PERMISSION để nhận quyền SYSTEM_ALERT_WINDOW; các ứng dụng chỉ cần yêu cầu SYSTEM_ALERT_WINDOW trực tiếp.

Các ý định MANAGE_OVERLAY_PERMISSION luôn đưa người dùng đến màn hình cấp 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, nơi người dùng có thể cấp hoặc thu hồi quyền SYSTEM_ALERT_WINDOW cho ứng dụng. Mọi dữ liệu package: trong ý định đều bị bỏ qua.

Trong các phiên bản Android cũ, ý định ACTION_MANAGE_OVERLAY_PERMISSION có thể chỉ định một gói, việc này sẽ đư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 nhằm bảo vệ người dùng bằng cách giúp họ cân nhắc kỹ hơn trước khi cấp quyề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 trong danh sách sau, 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ác với các phương thức trong danh sách trước, 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 READ_PHONE_STATE để ứng dụng của bạn chỉ sử dụng quyền này 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 bằng các thay đổi mới nhất về quyền riêng tư trong Android 11