투케이2K

122. (TWOK/LOGIC) [android] 안드로이드 하위 디바이스 (Q , 10 미만) 에서 WifiConfiguration 사용해 와 본문

투케이2K 로직정리

122. (TWOK/LOGIC) [android] 안드로이드 하위 디바이스 (Q , 10 미만) 에서 WifiConfiguration 사용해 와

투케이2K 2024. 11. 17. 13:45

[로직 정리]

정리 로직 : Android / 안드로이드

상태 : [android] 안드로이드 하위 디바이스 (Q , 10 미만) 에서 WifiConfiguration 사용해 와이파이 연결 및 연결 상태 체크 로직

 

[설 명]

 

// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------

- 안드로이드 특정 프로젝트 생성 및 build.gradle 파일에서 targetSdk 28 이하로 설정

- 안드로이드 하위 디바이스에서 WIFI 강제 연결을 위한 퍼미션 권한 설정 :

    /**
     * // --------------------------------------------------------------------------------------
     * TODO [권한 설정 설명]
     * // --------------------------------------------------------------------------------------
     *
     * TODO [안드로이드 13 이상] : [근처 기기 스캔 + 와이파이 접근 + 위치 접근]
     *
     * <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
     *
     * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     * <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     *
     * <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     * <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     * <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     * <uses-feature android:name="android.hardware.location.network"/>
     *
     *
     * TODO [안드로이드 13 미만] : [와이파이 접근 + 위치 접근]
     *
     * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     * <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     *
     * <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     * <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     * <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     * <uses-feature android:name="android.hardware.location.network"/>
     * // --------------------------------------------------------------------------------------
     * */

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------

1. 애플리케이션 수행 및 특정 기능 동작을 수행하기 위한 액티비티 화면 진입 (ex : 안드로이드 하위 디바이스 강제 WIFI 연결 화면)


2. 사전 사용자로 부터 WIFI 강제 연결을 위한 권한 부여 상태 체크 실시

  >> 권한이 부여 되지 않은 경우 : WIFI 연결에 필요한 권한 확인이 필요합니다. 팝업 알림창 표시


3. 정상적으로 권한이 부여 된 경우 추가적으로 WIFI 강제 연결을 하기 위한 WIFI 활성 상태 체크 (addNetwork 를 호출 하는 동안 wifi 가 켜져 있어야 합니다)

  >> WIFI 기능이 비활성 상태 인 경우 : WIFI 연결을 하기 위해서는 WIFI 기능이 활성화 되어 있어야합니다. 팝업 알림창 표시


4. WIFI 기능이 정상적으로 활성화 된 경우 >> 사전) 특정 WIFI 에 연결하기 위한 SSID 값이 이미 기존에 저장된 WIFI 목록에 있는 경우 삭제 수행

    WifiManager checkWifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> wifiConfigList = checkWifiManager.getConfiguredNetworks();

    if (wifiConfigList != null && wifiConfigList.size() > 0){ // [저장 된 값이 있는 경우]

        for (int i=0; i<wifiConfigList.size(); i++){

            WifiConfiguration getWifiConfig = wifiConfigList.get(i);

            if (getWifiConfig.SSID.trim().contains(ssid) == true){

                boolean removeFlag = checkWifiManager.removeNetwork(getWifiConfig.networkId);

                S_Log.e("reMoveWifiConfig", "SSID = " + String.valueOf(getWifiConfig.SSID) + " / " + "netId = " + String.valueOf(getWifiConfig.networkId) + " / " + "removeFlag = " + String.valueOf(removeFlag));
            }

        }
    }


5. WifiConfiguration 생성 및 디바이스 AP 연결 및 WPA , WPA2 연결 방식 선택해 설정 값 지정 수행 (ex : 디바이스 Soft AP 연결 설정)

    // TODO [WifiConfiguration : 와이파이 연결 옵션 설정 수행]
    WifiConfiguration wifiConfiguration = new WifiConfiguration();


    // TODO [초기 clear 작업 진행]
    wifiConfiguration.allowedAuthAlgorithms.clear();
    wifiConfiguration.allowedGroupCiphers.clear();
    wifiConfiguration.allowedKeyManagement.clear();
    wifiConfiguration.allowedPairwiseCiphers.clear();
    wifiConfiguration.allowedProtocols.clear();


    // TODO [와이파이 연결 정보 설정 수행]
    wifiConfiguration.SSID = "\"" + String.valueOf(ssid) + "\""; // [연결하고자 하는 SSID]
    wifiConfiguration.priority = 40;


    // -----------------------------------------------------------
    // TODO [디바이스] : [Soft AP 와이파이 연결 수행] : 비밀 번호 없는 AP 정보
    // -----------------------------------------------------------
    // TODO [참고] : 인터넷 사용이 확실하지 않은 상태로 >> 휴대폰이 자동으로 강한 신호에 연결 될 수 있음 :: 2회 정도 시도 필요
    // -----------------------------------------------------------

    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    wifiConfiguration.allowedAuthAlgorithms.clear();
    wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);


6. 설정한 wifiConfiguration 값을 addNetwork 추가 후 설정 값 저장 수행

    int addNetwork = wifiManager.addNetwork(wifiConfiguration); // [초기 네트워크 추가 수행]

    boolean saveFlag = wifiManager.saveConfiguration(); // [설정 저장]


7. 정상적으로 wifiManager.saveConfiguration 설정 값이 저장 된 경우 >> 기존에 연결 된 와이파이 연결 해제 및 지정한 WIFI 로 재연결 수행 실시

    // TODO [네트워크 연결 끊기]
    wifiManager.disconnect();

    // TODO [지정한 와이파이 enableNetwork 활성]
    boolean enableWifi = wifiManager.enableNetwork(addNetwork, true);

    // TODO [재연결 수행]
    boolean reconnectWifi = wifiManager.reconnect();


8. 정상적으로 reconnectWifi 가 완료 된 경우 핸들러 지정 및 2초 딜레이 설정 이후 현재 연결 된 와이파이 SSID 값 체크 수행

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {

            // [네트워크 변경 된 상태로 WifiManager 새로 선언]
            WifiManager newWifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);

            WifiInfo wifiInfo = newWifiManager.getConnectionInfo();

            // TODO [현재 연결 된 SSID 정보가 같은 경우]
            if (wifiInfo.getSSID().trim().contains(ssid) == true){

                S_Log._W_(ACTIVITY_NAME + " :: WifiConfiguration :: Connection Success Wifi", new String[]{
                        "nowConnectionSsid :: " + String.valueOf(wifiInfo.getSSID().trim())
                });

            }
            else {
                S_Log._E_(ACTIVITY_NAME + " :: WifiConfiguration :: Reconnect Error", new String[]{
                        "nowConnectionSsid :: " + String.valueOf(wifiInfo.getSSID().trim())
                });

            }

        }
        
    }, 2500); // TODO [딜레이 설정]


9. 현재 연결 된 WIFI SSID 와 연결 수행 시도 한 SSID 값이 값은 경우 true 값 반환, 아니면 false 값 반환 수행

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[와이파이 활성 및 연결 상태 확인 - WifiManager, ConnectivityManager, NetworkInfo]

https://blog.naver.com/kkh0977/222317648187?trackingCode=blog_bloghome_searchlist


[isWifiConnected : 현재 와이파이 연결 상태 확인]

https://blog.naver.com/kkh0977/223010826055?trackingCode=blog_bloghome_searchlist


[안드로이드 기기 로컬 핫스팟 WIFI 와이파이 SSID 조회 및 다이렉트 AP 연결 로직]

https://blog.naver.com/kkh0977/223646733424?trackingCode=blog_bloghome_searchlist


[안드로이드 WifiNetworkSpecifier , NetworkRequest , ConnectivityManager 사용 WPA 와이파이 연결]

https://blog.naver.com/kkh0977/223554797505?trackingCode=blog_bloghome_searchlist


[[targetSdk 22] 안드로이드 하위 버전 빌드 수행 및 WifiConfiguration 사용해 WPA , WPA2 와이파이 연결 수행]

https://blog.naver.com/kkh0977/223554794953?trackingCode=blog_bloghome_searchlist


[안드로이드 하위 버전 (9, Q 버전 미만) 와이파이 연결 WifiConfiguration 옵션 소스 코드]

https://blog.naver.com/kkh0977/223662005121


[안드로이드 하위 버전 (9, Q 버전 미만) WifiConfiguration 디바이스 AP 와이파이 연결 옵션 - Soft AP]

https://blog.naver.com/kkh0977/223662889509

// --------------------------------------------------------------------------------------

 

반응형
Comments