Как получить WIFI SSID в Android 9.0(PIE)?
Как получить WIFI SSID в Android 9.0(PIE)? Мой код работает нормально до Android 8.1.0, но он не работает на Android 9.0
ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
WifiManager wifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wifiInfo.getSSID();
String name = networkInfo.getExtraInfo();
String ssid = "\"" + wifiInfo.getSSID() + "\"";
}
Но этот код не работает на Android 9.0
1 ответ
Изменения в 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));
Вы можете получить доступ к SSID Wi-Fi, к которому вы подключены в Android 8, с разрешением местоположения, но в Android 9 вы должны включить местоположение. подробнее здесь:https://developer.android.com/about/versions/pie/android-9.0-changes-all
Это связано с разрешениями.... начиная с уровня API 27 вам нужно либо ACCESS_FINE_LOCATION
или же ACCESS_COARSE_LOCATION
разрешение. Вам также может понадобиться CHANGE_WIFI_STATE
для Android 9 (в любом случае это относится к сканированию Wi-Fi согласно https://developer.android.com/guide/topics/connectivity/wifi-scan)