Yêu cầu cấp quyền truy cập vào các thiết bị Wi-Fi ở gần

Các ứng dụng nhắm đến Android 13 (API cấp 33) trở lên và quản lý kết nối Wi-Fi phải yêu cầu quyền khi bắt đầu chạy NEARBY_WIFI_DEVICES. Quyền này giúp bạn dễ dàng điều chỉnh quyền truy cập của một ứng dụng vào các thiết bị Wi-Fi ở gần. Thay vào đó, trên các phiên bản Android cũ, các ứng dụng này cần khai báo quyền ACCESS_FINE_LOCATION.

Quyền này thuộc nhóm 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 tổ hợp quyền bất kỳ từ nhóm quyền này, hệ thống sẽ hiển thị một hộp thoại thời gian chạy 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 các quyền của Thiết bị ở gần theo dạng 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 cụ thể.

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 bạn nhắm đến Android 13 trở lên, hãy cân nhắc xem ứng dụng của bạn có lấy được thông tin vị trí từ API Wi-Fi hay không. Nếu không, bạn nên khẳng định chắc chắn điều đó. Để đư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 xác nhận rằng thông tin thiết bị Bluetooth không bao giờ được sử dụng cho thông tin 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 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 nên giữ lại mọi nội dung 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 không dựa vào thông tin vị trí chính xác, thì bạn có thể đặt phiên bản SDK tối đa của quyền này thành 32, như 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ếu ứng dụng của bạn nhắm mục tiêu đế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:

Quy trình truy cập Wi-Fi

Hình 1 cho thấy 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 ứng dụng nhắm đến Android 13 trở lên. Xin lưu ý rằng, miễn là bạn xác nhận rằng ứng dụng của mình không lấy thông tin vị trí thực tế qua thông tin thiết bị Wi-Fi, thì bạn không cần khai báo quyền ACCESS_FINE_LOCATION nữa:

Hình 1. Biểu đồ quy trình để xác định xem một ứng dụng nhắm đến Android 13 (API cấp 33) trở lên có thể truy cập thông tin Wi-Fi hay không.

Hình 2 thể hiện quy trình truy cập Wi-Fi trên các thiết bị chạy 12L trở xuống. Lưu ý rằng sự phụ thuộc vào quyền ACCESS_FINE_LOCATION.

Hình 2. Sơ đồ quy trình để xác định xem một ứng dụng nhắm đến 12L (API cấp 32) trở xuống có thể truy cập thông tin Wi-Fi hay không.