Изменения Android версии 9 (Pie) требуют, чтобы Location был включен (пользователем), или вызов getConnectioInfo () не удастся, даже если ваше приложение имеет правильные разрешения.
Это задокументировано в Android 9 изменениях (выдержка ниже):
Ограниченный доступ к местоположению Wi-Fi и информации о подключении
В Android 9 требования к разрешению приложения для сканирования Wi-Fi более строгие, чем в предыдущих версиях. Подробнее см. Ограничения сканирования Wi-Fi.
Аналогичные ограничения также применяются к методу getConnectionInfo (), который возвращает объект WifiInfo, описывающий текущее соединение Wi-Fi. Методы этого объекта можно использовать только для получения значений SSID и BSSID, если вызывающее приложение имеет следующие разрешения:
- ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
Для получения SSID или BSSID также необходимо, чтобы на устройстве были включены службы определения местоположения (в меню «Настройки»> «Местоположение»).
В моем случае я вызываю указанную ниже функцию (только если она работает на Android 9+), чтобы определить, включено ли местоположение, прежде чем пытаться прочитать WIDI SSID.
public static boolean isLocnEnabled(Context context) {
List locnProviders = null;
try {
LocationManager lm =(LocationManager) context.getApplicationContext().getSystemService(Activity.LOCATION_SERVICE);
locnProviders = lm.getProviders(true);
return (locnProviders.size() != 0);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (BuildConfig.DEBUG) {
if ((locnProviders == null) || (locnProviders.isEmpty()))
Log.d(TAG, "Location services disabled");
else
Log.d(TAG, "locnProviders: " + locnProviders.toString());
}
}
return(false);
}
Если местоположение не включено, я выскакиваю диалоговое окно, которое говорит, что это необходимо, и позволяет пользователю перейти на страницу настроек местоположения (см. Код ниже):
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));