code

WIFI가 연결되면 SSID 받기

codestyles 2021. 1. 9. 09:56
반응형

WIFI가 연결되면 SSID 받기


내 안드로이드 장치가 WIFI에 연결되어있을 때 WIFI 네트워크의 SSID를 얻으려고합니다.

을 (를) 듣고있는 BroadcastReceiver를 등록했습니다 android.net.wifi.supplicant.CONNECTION_CHANGE. WIFI 연결이 끊어 지거나 다시 연결되면 알림을받습니다. 불행히도 네트워크의 SSID를 가져올 수 없습니다.

SSID를 찾기 위해 다음 코드를 사용하고 있습니다.

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

SSID 대신 문자열을 <unknown ssid>다시 얻습니다 .

이것들은 매니페스트의 권한입니다 (확인하기 위해 ACCESS_NETWORK_STATE를 추가했지만 실제로는 필요하지 않습니다)

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

왜 이런 일이 발생합니까? 실제 SSID는 어떻게 얻을 수 있습니까? 연결이 설정되기 전에 방송이 일찍 시작됩니까? 들어야 할 또 다른 방송이 있습니까? 3G 연결이 아닌 WIFI 연결에만 관심이 있습니다.

업데이트 : 방금 확인하고 wifiInfo.getBSSID()null을 반환합니다.


브로드 캐스트 수신기에서 WifiManager.NETWORK_STATE_CHANGED_ACTION을 수신합니다.

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
        NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
        if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {

netInfo.isConnected ()를 확인합니다. 그런 다음 사용할 수 있습니다

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();

최신 정보

안드로이드 8.0부터는 GPS가 켜져 있지 않으면 연결된 네트워크의 SSID를 얻지 못합니다.


Android 8.1 (API 27) 부터 또는 에서 결과를 얻으려면 앱에 ACCESS_COARSE_LOCATION(또는 ACCESS_FINE_LOCATION) 권한을 부여해야합니다 .WifiInfo.getSSID()WifiInfo.getBSSID()

이 권한은 결과를 얻기 위해 필요 WifiManager.getConnectionInfo()하고 WifiManager.getScanResults()이것은 8.1의 새로운 또는 이전에 필요한 경우는 명확하지 않지만.

출처 : "BSSID / SSID를 사용하여 위치를 추론 할 수 있으므로 WifiManager.getConnectionInfo ()를 사용하여 요청한 이러한 WifiInfo 필드에 액세스하려면 WifiManager.getScanResults ()와 동일한 위치 권한이 필요합니다."


Broadcast Receiver를 만들고 싶지 않다면 간단하게 시도하십시오.

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}

사용자가 연결을 끊거나 새 SSID 또는 Wi-Fi 상태 변경에 연결할 때마다 WifiInfo를 초기화해야합니다. wifiInfo = wifiManager.getConnectionInfo();


현재 연결된 Wifi AP의 SSID를 얻을 수있는 흥미로운 솔루션을 찾았습니다. 반복을 사용 WifiManager.getConfiguredNetworks()하고 특정 구성을 찾기 만하면됩니다.WifiInfo.getNetworkId()

내 예

작업이있는 브로드 캐스트 수신기 WifiManager.NETWORK_STATE_CHANGED_ACTION에서 의도에서 현재 연결 상태를 얻고 있습니다.

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()

경우 NetworkInfo.getStateIS가 동일 NetworkInfo.State.CONNECTED그럼 내가 현재 WifiInfo 객체를 얻을 수 있습니다

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();

그리고 나서

public String findSSIDForWifiInfo(WifiManager manager, WifiInfo wifiInfo) {

    List<WifiConfiguration> listOfConfigurations = manager.getConfiguredNetworks();

    for (int index = 0; index < listOfConfigurations.size(); index++) {
        WifiConfiguration configuration = listOfConfigurations.get(index);
        if (configuration.networkId == wifiInfo.getNetworkId()) {
            return configuration.SSID;
        }
    }

    return null;
}

그리고이 방법 이 위치 나 위치 권한을 요구하지 않는 매우 중요한 것은


Android 8.1에서 SSID를 얻으려면 위치를 켜야합니다. 연결 상태는 얻을 수 없지만 SSID는 얻을 수 없습니다.

WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = null;
if (wifiManager != null) 
wifiInfo = wifiManager.getConnectionInfo();
 String ssid = null;
if (wifiInfo != null) 
ssid = wifiInfo.getSSID(); /*you will get SSID <unknown ssid> if location turned off*/

이것은 @EricWoodruff가 제공 한 답변에 대한 후속 조치입니다.

You could use netInfo's getExtraInfo() to get wifi SSID.

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
    NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
    if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
        String ssid = info.getExtraInfo()
        Log.d(TAG, "WiFi SSID: " + ssid)
    }
}

If you are not using BroadcastReceiver check this answer to get SSID using Context

This is tested on Android Oreo 8.1.0


Android 9 SSID showing NULL values use this code..

ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo.isConnected()) {
            WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            wifiInfo.getSSID();
            String name = networkInfo.getExtraInfo();
            String ssid = wifiInfo.getSSID();
            return ssid.replaceAll("^\"|\"$", "");
        }

ReferenceURL : https://stackoverflow.com/questions/21391395/get-ssid-when-wifi-is-connected

반응형