Android 10 (cấp độ API 29) giới thiệu một số tính năng và thay đổi về hành vi để bảo vệ tốt hơn quyền riêng tư của người dùng. Những thay đổi này mở rộng tính minh bạch và quyền kiểm soát mà người dùng có đối với dữ liệu của họ và các chức năng mà họ cấp cho ứng dụng. Những tính năng này có thể có nghĩa là các hành vi hoặc dữ liệu cụ thể mà ứng dụng của bạn đang dựa vào có thể hoạt động khác so với các phiên bản cũ của nền tảng. Tác động đối với ứng dụng của bạn sẽ ở mức tối thiểu nếu ứng dụng của bạn tuân theo các phương pháp hay nhất hiện tại để xử lý dữ liệu người dùng.
Trang này liệt kê bản tóm tắt của từng thay đổi.
Các thay đổi hàng đầu
Phần này bao gồm các thay đổi chính trong Android 10 liên quan đến quyền riêng tư.
Quyền truy cập vào bộ nhớ ngoài được giới hạn trong các tệp và nội dung nghe nhìn của ứng dụng
Theo mặc định, các ứng dụng nhắm đến Android 10 trở lên được cấp quyền truy cập có giới hạn vào bộ nhớ ngoài, hay bộ nhớ có giới hạn. Các ứng dụng như vậy có thể thấy các loại tệp sau trong một thiết bị lưu trữ ngoài mà không cần yêu cầu bất kỳ quyền nào liên quan đến bộ nhớ của người dùng:
- Các tệp trong thư mục dành riêng cho ứng dụng, được truy cập bằng
getExternalFilesDir(). - Ảnh, video và đoạn âm thanh mà ứng dụng đã tạo từ kho nội dung nghe nhìn.
Để tìm hiểu thêm về bộ nhớ có giới hạn, cũng như cách chia sẻ, truy cập và sửa đổi các tệp được lưu trên thiết bị lưu trữ ngoài, hãy xem hướng dẫn về cách quản lý tệp trong bộ nhớ ngoài và truy cập cũng như sửa đổi tệp nội dung nghe nhìn.
Quyền truy cập vào thông tin vị trí của thiết bị ở chế độ nền
Để hỗ trợ quyền kiểm soát bổ sung mà người dùng có đối với quyền truy cập của ứng dụng vào
thông tin vị trí, Android 10 giới thiệu
ACCESS_BACKGROUND_LOCATION
quyền.
Không giống như quyền
ACCESS_FINE_LOCATION
và
ACCESS_COARSE_LOCATION, quyền ACCESS_BACKGROUND_LOCATION chỉ ảnh hưởng đến quyền truy cập của ứng dụng vào thông tin vị trí khi ứng dụng chạy ở chế độ nền. Một ứng dụng được coi là đang truy cập vào thông tin vị trí ở chế độ nền, trừ phi một trong các điều kiện sau được đáp ứng:
- Một hoạt động thuộc ứng dụng đang hiển thị.
Ứng dụng đang chạy một dịch vụ trên nền trước đã khai báo loại dịch vụ trên nền trước là
location.Để khai báo loại dịch vụ trên nền trước cho một dịch vụ trong ứng dụng, hãy đặt
targetSdkVersionhoặccompileSdkVersioncủa ứng dụng thành29trở lên. Tìm hiểu thêm về cách các dịch vụ trên nền trước có thể tiếp tục các hành động do người dùng khởi xướng yêu cầu quyền truy cập vào thông tin vị trí.
Nếu ứng dụng của bạn tạo và giám sát hàng rào địa lý và
nhắm đến Android 10 (cấp độ API 29) trở lên, thì bạn phải khai báo quyền
ACCESS_BACKGROUND_LOCATION.
Quyền truy cập được cấp tự động khi nhắm đến Android 9 trở xuống
Nếu ứng dụng của bạn chạy trên Android 10 trở lên nhưng nhắm đến Android 9 (cấp độ API 28) trở xuống, thì nền tảng sẽ áp dụng hành vi sau:
- Nếu ứng dụng của bạn khai báo một
<uses-permission>phần tử choACCESS_FINE_LOCATIONhoặcACCESS_COARSE_LOCATION, thì hệ thống sẽ tự động thêm một<uses-permission>phần tử choACCESS_BACKGROUND_LOCATIONtrong quá trình cài đặt. - Nếu ứng dụng của bạn yêu cầu
ACCESS_FINE_LOCATIONhoặcACCESS_COARSE_LOCATION, thì hệ thống sẽ tự động thêmACCESS_BACKGROUND_LOCATIONvào yêu cầu.
Quyền truy cập khi thiết bị được nâng cấp lên Android 10
Nếu người dùng cấp cho ứng dụng của bạn quyền truy cập vào thông tin vị trí của thiết bị (hoặc
ACCESS_COARSE_LOCATION
hoặc
ACCESS_FINE_LOCATION
), sau đó nâng cấp thiết bị của họ từ Android 9 lên Android 10,
thì hệ thống sẽ tự động cập nhật tập hợp các quyền dựa trên vị trí được cấp
cho ứng dụng của bạn. Tập hợp các quyền mà ứng dụng của bạn nhận được sau khi nâng cấp
phụ thuộc vào phiên bản SDK mục tiêu và các quyền được xác định của ứng dụng, như trong
bảng sau:
Bảng 1. Các thay đổi về trạng thái quyền truy cập thông tin vị trí sau khi nâng cấp thiết bị lên Android 10
| Phiên bản nền tảng nhắm mục tiêu | Đã cấp quyền truy cập thông tin vị trí thô hoặc chính xác ? |
Đã xác định quyền truy cập thông tin vị trí ở chế độ nền trong tệp kê khai? |
Trạng thái quyền mặc định đã cập nhật |
|---|---|---|---|
| Android 10 | Có | Có | Quyền truy cập ở nền trước và quyền truy cập khi ở nền sau |
| Android 10 | Có | Không | Chỉ quyền truy cập khi ở nền trước |
| Android 10 | Không | (Hệ thống bỏ qua) | Không có quyền truy cập |
| Android 9 trở xuống | Có | Hệ thống tự động thêm khi nâng cấp thiết bị | Quyền truy cập ở nền trước và quyền truy cập khi ở nền sau |
| Android 9 trở xuống | Không | (Hệ thống bỏ qua) | Không có quyền truy cập |
Xin lưu ý rằng người dùng có thể thay đổi cấp độ truy cập này ngay cả sau khi hệ thống tự động cập nhật quyền truy cập của ứng dụng vào thông tin vị trí của thiết bị. Ví dụ: người dùng có thể giảm quyền truy cập của ứng dụng xuống chỉ ở nền trước hoặc thu hồi hoàn toàn quyền truy cập. Trước khi cố gắng truy cập vào thông tin vị trí của thiết bị, đặc biệt là trong một dịch vụ trên nền trước, ứng dụng của bạn nên kiểm tra xem người dùng có còn cho phép ứng dụng của bạn nhận thông tin vị trí này hay không.
Quyền truy cập bị thu hồi khi cập nhật cấp độ API mục tiêu trên thiết bị Android 10
Hãy xem xét trường hợp ứng dụng của bạn đã được cài đặt trên một thiết bị chạy Android 10. Nếu bạn cập nhật ứng dụng để nhắm đến Android 10 trong trường hợp này, thì thiết bị sẽ thu hồi quyền ACCESS_BACKGROUND_LOCATION.
Hạn chế khi bắt đầu hoạt động ở chế độ nền
Kể từ Android 10, hệ thống sẽ đặt ra các hạn chế khi bắt đầu hoạt động ở chế độ nền. Thay đổi về hành vi này giúp giảm thiểu sự gián đoạn cho người dùng và giúp người dùng kiểm soát nhiều hơn những gì hiển thị trên màn hình của họ. Miễn là ứng dụng của bạn bắt đầu các hoạt động do lượt tương tác trực tiếp của người dùng, thì ứng dụng của bạn rất có thể không bị ảnh hưởng bởi những hạn chế này.
Để tìm hiểu thêm về giải pháp thay thế được đề xuất cho việc bắt đầu các hoạt động ở chế độ nền, hãy xem hướng dẫn về cách cảnh báo người dùng về các sự kiện nhạy cảm về thời gian trong ứng dụng của bạn.
Giá trị nhận dạng và dữ liệu
Phần này liệt kê các thay đổi dành riêng cho việc làm việc với giá trị nhận dạng và dữ liệu thiết bị.
Xoá mối quan hệ thân thiết với danh bạ
Kể từ Android 10, nền tảng này không theo dõi thông tin về mối quan hệ thân thiết với danh bạ. Do đó, nếu ứng dụng của bạn thực hiện tìm kiếm trên danh bạ của người dùng, thì kết quả sẽ không được sắp xếp theo tần suất tương tác.
Hướng dẫn về ContactsProvider có một thông báo mô tả các
trường và phương thức cụ thể đã
lỗi thời trên tất cả các thiết bị
kể từ Android 10.
Dùng địa chỉ MAC ngẫu nhiên
Trên các thiết bị chạy Android 10 trở lên, hệ thống sẽ truyền địa chỉ MAC ngẫu nhiên theo mặc định.
Nếu ứng dụng của bạn xử lý một trường hợp sử dụng doanh nghiệp, thì nền tảng sẽ cung cấp API cho một số thao tác liên quan đến địa chỉ MAC:
- Lấy địa chỉ MAC ngẫu nhiên: Các ứng dụng chủ sở hữu thiết bị và ứng dụng chủ sở hữu hồ sơ
có thể truy xuất địa chỉ MAC ngẫu nhiên được gán cho một mạng cụ thể bằng cách
gọi
getRandomizedMacAddress(). - Lấy địa chỉ MAC thực tế, địa chỉ MAC gốc: Các ứng dụng chủ sở hữu thiết bị có thể truy xuất
địa chỉ MAC phần cứng thực tế của thiết bị bằng cách gọi
getWifiMacAddress(). Phương thức này hữu ích cho việc theo dõi các nhóm thiết bị.
Hạn chế quyền truy cập vào hệ thống tệp /proc/net
Trên các thiết bị chạy Android 10 trở lên, các ứng dụng không thể truy cập vào /proc/net, bao gồm thông tin về trạng thái mạng của thiết bị. Các ứng dụng
cần truy cập vào thông tin này, chẳng hạn như VPN, nên sử dụng lớp
NetworkStatsManager hoặc
ConnectivityManager.
Hạn chế đối với giá trị nhận dạng thiết bị không thể đặt lại
Kể từ Android 10, các ứng dụng phải có quyền đặc biệt READ_PRIVILEGED_PHONE_STATE để truy cập vào giá trị nhận dạng không thể đặt lại của thiết bị, bao gồm cả IMEI và số sê-ri.
Các phương thức bị ảnh hưởng bao gồm:
BuildTelephonyManager
Nếu ứng dụng của bạn không có quyền và bạn vẫn cố gắng yêu cầu thông tin về giá trị nhận dạng không thể đặt lại, thì phản hồi của nền tảng sẽ khác nhau dựa trên phiên bản SDK mục tiêu:
- Nếu ứng dụng của bạn nhắm đến Android 10 trở lên, thì a
SecurityExceptionsẽ xảy ra. - Nếu ứng dụng của bạn nhắm đến Android 9 (cấp độ API 28) trở xuống, thì phương thức sẽ trả về
nullhoặc dữ liệu giữ chỗ nếu ứng dụng có quyềnREAD_PHONE_STATE. Nếu không,SecurityExceptionsẽ xảy ra.
Nhiều trường hợp sử dụng không cần giá trị nhận dạng thiết bị không thể đặt lại. Ví dụ: nếu ứng dụng của bạn sử dụng giá trị nhận dạng thiết bị không thể đặt lại cho mục đích theo dõi quảng cáo hoặc phân tích người dùng , hãy sử dụng Mã nhận dạng cho quảng cáo trên Android cho các trường hợp sử dụng cụ thể đó thay thế. Để tìm hiểu thêm, hãy xem các phương pháp hay nhất cho giá trị nhận dạng duy nhất.
Quyền truy cập giới hạn vào dữ liệu trên bảng nhớ tạm
Trừ phi ứng dụng của bạn là trình chỉnh sửa phương thức nhập (IME) mặc định hoặc là ứng dụng hiện đang có tiêu điểm, nếu không, ứng dụng của bạn không thể truy cập vào dữ liệu trên bảng nhớ tạm trên Android 10 trở lên.
Bảo vệ số sê-ri của thiết bị USB
Nếu ứng dụng của bạn nhắm đến Android 10 trở lên, thì ứng dụng của bạn không thể đọc số sê-ri cho đến khi người dùng cấp cho ứng dụng của bạn quyền truy cập vào thiết bị hoặc phụ kiện USB.
Để tìm hiểu thêm về cách làm việc với thiết bị USB, hãy xem hướng dẫn về cách định cấu hình máy chủ USB.
Máy ảnh và khả năng kết nối
Phần này liệt kê các thay đổi dành riêng cho siêu dữ liệu máy ảnh và API kết nối.
Hạn chế quyền truy cập vào thông tin chi tiết và siêu dữ liệu của máy ảnh
Android 10 thay đổi phạm vi thông tin mà
getCameraCharacteristics()
phương thức trả về theo mặc định. Cụ thể, ứng dụng của bạn phải có quyền
CAMERA để
truy cập vào siêu dữ liệu có khả năng dành riêng cho thiết bị được đưa vào giá trị
trả về của phương thức này.
Để tìm hiểu thêm về những thay đổi này, hãy xem phần về các trường máy ảnh yêu cầu quyền .
Hạn chế đối với việc bật và tắt Wi-Fi
Các ứng dụng nhắm đến Android 10 trở lên không thể bật hoặc tắt Wi-Fi. Phương thức luôn trả về false.WifiManager.setWifiEnabled()
Nếu bạn cần nhắc người dùng bật và tắt Wi-Fi, hãy sử dụng bảng điều khiển cài đặt.
Hạn chế đối với quyền truy cập trực tiếp vào các mạng Wi-Fi đã định cấu hình
Để bảo vệ quyền riêng tư của người dùng, việc định cấu hình thủ công danh sách mạng Wi-Fi bị giới hạn đối với các ứng dụng hệ thống và bộ điều khiển chính sách thiết bị (DPC). Một DPC nhất định có thể là chủ sở hữu thiết bị hoặc chủ sở hữu hồ sơ.
Nếu ứng dụng của bạn nhắm đến Android 10 trở lên và không phải là ứng dụng hệ thống hoặc DPC, thì các phương thức sau sẽ không trả về dữ liệu hữu ích:
Phương thức
getConfiguredNetworks()luôn trả về một danh sách trống.Mỗi phương thức thao tác mạng trả về một giá trị số nguyên —
addNetwork()vàupdateNetwork()—luôn trả về -1.Mỗi thao tác mạng trả về một giá trị boolean —
removeNetwork(),reassociate(),enableNetwork(),disableNetwork(),reconnect(), vàdisconnect()—luôn trả vềfalse.
Nếu ứng dụng của bạn cần kết nối với mạng Wi-Fi, hãy sử dụng các phương thức thay thế sau:
- Để kích hoạt kết nối cục bộ tức thì với mạng Wi-Fi, hãy sử dụng
WifiNetworkSpecifiertrong một đối tượngNetworkRequesttiêu chuẩn. - Để thêm mạng Wi-Fi nhằm xem xét việc cung cấp quyền truy cập Internet cho người dùng, hãy làm việc với các đối tượng.
WifiNetworkSuggestionBạn có thể thêm và xoá các mạng xuất hiện trong hộp thoại chọn mạng tự động kết nối bằng cách gọiaddNetworkSuggestions()vàremoveNetworkSuggestions(), tương ứng. Các phương thức này không yêu cầu bất kỳ quyền truy cập thông tin vị trí nào.
Một số API điện thoại, Bluetooth, Wi-Fi yêu cầu quyền truy cập thông tin vị trí CHÍNH XÁC
Nếu ứng dụng của bạn nhắm đến Android 10 trở lên, thì ứng dụng đó phải có
ACCESS_FINE_LOCATION
quyền để sử dụng một số phương thức trong API Wi-Fi, Wi-Fi Aware,
hoặc Bluetooth. Các phần sau đây liệt kê các lớp và phương thức bị ảnh hưởng.
Điện thoại
TelephonyManagergetCellLocation()getAllCellInfo()requestNetworkScan()requestCellInfoUpdate()getAvailableNetworks()getServiceState()
TelephonyScanManagerrequestNetworkScan()
TelephonyScanManager.NetworkScanCallbackonResults()
PhoneStateListeneronCellLocationChanged()onCellInfoChanged()onServiceStateChanged()
Wi-Fi
WifiManagerstartScan()getScanResults()getConnectionInfo()getConfiguredNetworks()
WifiAwareManagerWifiP2pManagerWifiRttManager
Bluetooth
BluetoothAdapterstartDiscovery()startLeScan()
BluetoothAdapter.LeScanCallbackBluetoothLeScannerstartScan()
Quyền
Phần này mô tả các bản cập nhật cho mô hình quản lý quyền của Android.
Hạn chế quyền truy cập vào nội dung màn hình
Để bảo vệ nội dung màn hình của người dùng, Android 10 ngăn chặn quyền truy cập im lặng vào nội dung màn hình của thiết bị bằng cách thay đổi phạm vi của các quyền READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT và CAPTURE_SECURE_VIDEO_OUTPUT. Kể từ Android 10, các quyền này chỉ có quyền truy cập chữ ký
.
Các ứng dụng cần truy cập vào nội dung màn hình của thiết bị nên sử dụng API
MediaProjection, API này sẽ hiển thị một lời nhắc yêu cầu người dùng đồng ý.
Kiểm tra quyền đối diện với người dùng trên các ứng dụng cũ
Nếu ứng dụng của bạn nhắm đến Android 5.1 (cấp độ API 22) trở xuống, thì người dùng sẽ thấy màn hình quyền khi sử dụng ứng dụng của bạn trên một thiết bị chạy Android 10 trở lên lần đầu tiên, như trong Hình 1. Màn hình này cho phép người dùng thu hồi quyền truy cập vào các quyền mà hệ thống đã cấp cho ứng dụng của bạn tại thời điểm cài đặt.
Nhận dạng hoạt động thể chất
Android 10 giới thiệu quyền khi bắt đầu chạy
android.permission.ACTIVITY_RECOGNITION
cho các ứng dụng cần phát hiện số bước của người dùng hoặc
phân loại hoạt động thể chất của người dùng, chẳng hạn như đi bộ, đi xe đạp hoặc di chuyển trong
xe. Tính năng này được thiết kế để cho người dùng thấy cách dữ liệu cảm biến thiết bị được sử dụng trong phần Cài đặt.
Một số thư viện trong Dịch vụ Google Play, chẳng hạn như API Nhận dạng hoạt động và API Google Fit, không cung cấp kết quả trừ phi người dùng đã cấp cho ứng dụng của bạn quyền này.
Các cảm biến tích hợp duy nhất trên thiết bị yêu cầu bạn khai báo quyền này là cảm biến đếm bước và cảm biến phát hiện bước.
Nếu ứng dụng của bạn nhắm đến Android 9 (cấp độ API 28) trở xuống, thì hệ thống sẽ tự động cấp quyền android.permission.ACTIVITY_RECOGNITION cho ứng dụng của bạn (nếu cần) nếu ứng dụng của bạn đáp ứng từng điều kiện sau:
- Tệp kê khai bao gồm quyền
com.google.android.gms.permission.ACTIVITY_RECOGNITION. - Tệp kê khai không bao gồm quyền
android.permission.ACTIVITY_RECOGNITION.
Nếu hệ thống tự động cấp quyền android.permission.ACTIVITY_RECOGNITION, thì ứng dụng của bạn sẽ giữ lại quyền này sau khi bạn cập nhật ứng dụng để nhắm đến Android 10. Tuy nhiên, người dùng có thể thu hồi quyền này bất cứ lúc nào trong phần cài đặt hệ thống.
Đã xoá các nhóm quyền khỏi giao diện người dùng
Kể từ Android 10, các ứng dụng không thể tra cứu cách quyền được nhóm trong giao diện người dùng.