Запросить разрешение на доступ к близлежащим устройствам Wi-Fi

Приложения, предназначенные для Android 13 (уровень API 33) или выше и управляющие соединениями Wi-Fi, должны запрашивать разрешение среды выполнения NEARBY_WIFI_DEVICES . Это разрешение упрощает обоснование доступа приложения к близлежащим устройствам Wi-Fi; в предыдущих версиях Android этим приложениям необходимо было вместо этого объявить разрешение ACCESS_FINE_LOCATION .

Разрешение входит в группу устройств поблизости.

Разрешение NEARBY_WIFI_DEVICES является частью группы разрешений «Устройства поблизости» . Эта группа, добавленная в Android 12 (уровень API 31), также включает разрешения, связанные с Bluetooth и сверхширокополосным доступом. Когда вы запрашиваете любую комбинацию разрешений из этой группы разрешений, система отображает одно диалоговое окно времени выполнения и просит пользователя одобрить доступ вашего приложения к устройствам поблизости. В настройках системы пользователь должен включать и отключать разрешения « Устройства поблизости» как группу; например, пользователи не могут отключить доступ к Wi-Fi, но оставить доступ Bluetooth включенным для определенного приложения.

Настойчиво утверждайте, что ваше приложение не определяет физическое местоположение.

Если вы ориентируетесь на Android 13 или более поздней версии, подумайте, получает ли ваше приложение информацию о местоположении из API Wi-Fi; если нет, то вам следует решительно заявить об этом. Чтобы сделать это утверждение, установите для атрибута usesPermissionFlags значение neverForLocation в файле манифеста вашего приложения, как показано в следующем фрагменте кода. Этот процесс аналогичен тому, который вы делаете, когда утверждаете, что информация об устройстве Bluetooth никогда не используется для определения местоположения :

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

Предыдущие версии и некоторые API требуют разрешения на определение местоположения.

Некоторым API Wi-Fi требуется разрешение ACCESS_FINE_LOCATION , даже если ваше приложение предназначено для Android 13 или более поздней версии. Примеры включают следующие методы класса WifiManager :

Кроме того, поскольку разрешение NEARBY_WIFI_DEVICES доступно только на Android 13 и более поздних версиях, вам следует сохранить все объявления для ACCESS_FINE_LOCATION , чтобы обеспечить обратную совместимость в вашем приложении. Однако, если ваше приложение иным образом не использует точную информацию о местоположении , вы можете установить максимальную версию SDK этого разрешения на 32 , как показано в следующем фрагменте кода:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

Проверьте API, требующие разрешения

Если ваше приложение предназначено для Android 13 или более поздней версии, вы должны объявить разрешение NEARBY_WIFI_DEVICES для вызова любого из следующих API Wi-Fi:

Рабочие процессы доступа к Wi-Fi

На рис. 1 показан рабочий процесс доступа к Wi-Fi на устройствах под управлением Android 13 или более поздней версии для приложений, ориентированных на Android 13 или более поздней версии. Обратите внимание: пока вы утверждаете, что ваше приложение не определяет физическое местоположение на основе информации об устройстве Wi-Fi, вам больше не нужно объявлять разрешение ACCESS_FINE_LOCATION :

Рисунок 1. Блок-схема определения того, может ли приложение, предназначенное для Android 13 (уровень API 33) или более поздней версии, получить доступ к информации Wi-Fi.

На рис. 2 показан рабочий процесс доступа к Wi-Fi на устройствах с процессором 12L или ниже. Обратите внимание на зависимость от разрешения ACCESS_FINE_LOCATION .

Рисунок 2. Блок-схема определения того, может ли приложение, ориентированное на 12L (уровень API 32) или ниже, получать доступ к информации Wi-Fi.