Những ứng dụng nhắm đến Android 13 (API cấp 33) trở lên và quản lý các kết nối Wi-Fi nên yêu cầu NEARBY_WIFI_DEVICES
quyền khi bắt đầu chạy. Quyền này giúp bạn dễ dàng biện minh cho việc ứng dụng truy cập vào các thiết bị Wi-Fi ở gần; trên các phiên bản Android trước đây, những ứng dụng này cần khai báo quyền ACCESS_FINE_LOCATION
.
Quyền này thuộc nhóm quyền đối với các thiết bị ở gần
Quyền NEARBY_WIFI_DEVICES
thuộc nhóm quyền Thiết bị ở gần. Nhóm này được thêm vào Android 12 (API cấp 31), cũng bao gồm các quyền liên quan đến Bluetooth và Băng tần siêu rộng. Khi bạn yêu cầu bất kỳ tổ hợp quyền nào trong nhóm quyền này, hệ thống sẽ hiện một hộp thoại thời gian chạy duy nhất và yêu cầu người dùng phê duyệt quyền truy cập của ứng dụng vào các thiết bị ở gần.
Trong phần cài đặt hệ thống, người dùng phải bật và tắt quyền truy cập Thiết bị ở gần theo nhóm; ví dụ: người dùng không thể tắt quyền truy cập Wi-Fi nhưng vẫn bật quyền truy cập Bluetooth cho một ứng dụng nhất định.
Khẳng định chắc chắn rằng ứng dụng của bạn không lấy thông tin vị trí thực tế
Khi nhắm đến Android 13 trở lên, hãy cân nhắc xem ứng dụng của bạn có bao giờ lấy thông tin vị trí từ các API Wi-Fi hay không; nếu không, bạn nên khẳng định chắc chắn rằng ứng dụng không lấy thông tin vị trí từ các API Wi-Fi. Để đưa ra khẳng định này, hãy đặt thuộc tính usesPermissionFlags
thành neverForLocation
trong tệp kê khai của ứng dụng, như minh hoạ trong đoạn mã sau. Quy trình này tương tự như quy trình bạn thực hiện khi khẳng định rằng thông tin về thiết bị Bluetooth không bao giờ được dùng để xác định vị trí:
<manifest ...> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <application ...> ... </application> </manifest>
Các phiên bản trước và một số API yêu cầu quyền truy cập thông tin vị trí
Một số API Wi-Fi yêu cầu quyền ACCESS_FINE_LOCATION
, ngay cả khi ứng dụng của bạn nhắm đến Android 13 trở lên. Ví dụ: các phương thức sau đây trong lớp WifiManager
:
Ngoài ra, vì quyền NEARBY_WIFI_DEVICES
chỉ có trên Android 13 trở lên, nên bạn phải giữ mọi khai báo cho ACCESS_FINE_LOCATION
để cung cấp khả năng tương thích ngược trong ứng dụng. Tuy nhiên, miễn là ứng dụng của bạn không phụ thuộc vào thông tin vị trí chính xác, bạn có thể đặt phiên bản SDK tối đa của quyền này thành 32
, như minh hoạ trong đoạn mã sau:
<manifest ...> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" /> <application ...> ... </application> </manifest>
Kiểm tra các API yêu cầu quyền này
Nếu ứng dụng của bạn nhắm đến Android 13 trở lên, bạn phải khai báo quyền NEARBY_WIFI_DEVICES
để gọi bất kỳ API Wi-Fi nào sau đây:
WifiManager
WifiAwareManager
WifiAwareSession
WifiP2pManager
WifiRttManager
Quy trình cấp quyền truy cập Wi-Fi
Hình 1 minh hoạ quy trình truy cập Wi-Fi trên các thiết bị chạy Android 13 trở lên, đối với những ứng dụng nhắm đến Android 13 trở lên. Xin lưu ý rằng, miễn là bạn khẳng định ứng dụng của mình không lấy thông tin vị trí thực tế từ thông tin thiết bị Wi-Fi, bạn không cần khai báo quyền ACCESS_FINE_LOCATION
nữa:
Hình 2 cho thấy quy trình truy cập Wi-Fi trên các thiết bị chạy 12L trở xuống. Lưu ý sự phụ thuộc vào quyền ACCESS_FINE_LOCATION
.