투케이2K

124. (TWOK/LOGIC) [android] 안드로이드 connectivityManager requestNetwork 특정 WIFI 와이파이 연결 시 타임 아웃 설정 로직 본문

투케이2K 로직정리

124. (TWOK/LOGIC) [android] 안드로이드 connectivityManager requestNetwork 특정 WIFI 와이파이 연결 시 타임 아웃 설정 로직

투케이2K 2024. 11. 20. 19:53

[로직 정리]

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

상태 : [android] 안드로이드 connectivityManager requestNetwork 특정 WIFI 와이파이 연결 시 타임 아웃 설정 로직

 

[설 명]

 

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

- 해당 기능 사용을 위한 디바이스 제한 정책 설정 : 안드로이드 10 (Q) 이상 지원 기능 설정

- 다이렉트 연결을 하는 WIFI 는 WPA/WPA2 로 제한 설정

- 안드로이드 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. 애플리케이션 수행 및 다이렉트 WIFI 연결을 위한 특정 화면으로 진행 수행



2. WifiNetworkSpecifier 을 사용해 연결하려는 와이파이 SSID, PW 입력 정보 설정

  WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
    .setSsid(String.valueOf(ssid))
    .setWpa2Passphrase(String.valueOf(password)) // TODO [WPA2 형식]
    .build();



3. NetworkRequest 사용해 연결 요청 타입 지정 (WIFI 연결 타입)

    NetworkRequest networkRequest = new NetworkRequest.Builder()
        .removeTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // [와이파이 사용 활성]
        .setNetworkSpecifier(wifiNetworkSpecifier)
        .build();



4. handler.postDelayed 핸들러 생성 및 타임 아웃 발생 시 connectivityManager.unregisterNetworkCallback 연결 요청 해제 설정 수행

    int connectionTimeOut = 15; // [연결 타임 아웃 시간]
                                                
    Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            S_Log._E_(ACTIVITY_NAME + " :: NetworkCallback :: 와이파이 AP 다이렉트 연결 타임 아웃 발생", null);

            // [콜백 해제] : [AP 연결 종료]
            try {
                if (connectivityApManager != null){
                    connectivityApManager.unregisterNetworkCallback(networkCallback);
                    connectivityApManager = null;
                    connectivityApFlag = false;
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }


            // [리턴 반환 실시]
            if (subscriber != null && subscriber.isDisposed() == false
                    && connectivityApFlag == false) {
                subscriber.onError(new Throwable("AP_CONNECT_TIMEOUT"));
                subscriber.onComplete();
            }

        }

    }, connectionTimeOut * 1000);



5. ConnectivityManager.NetworkCallback 네트워크 연결 상태 확인 콜백 이벤트 리스너 생성 후 
   연결 완료 및 연결 실패 시 예정 된 핸들러 타임 아웃 취소 동작 처리

    networkCallback = new ConnectivityManager.NetworkCallback() {

        @Override
        public void onAvailable(Network network) { // TODO [연결 완료 및 소켓 통신 사용 가능]
            super.onAvailable(network);
            S_Log._W_(ACTIVITY_NAME + " :: NetworkCallback :: onAvailable :: Wifi Connection Success", null);


            // [예약 된 핸들러 작업 취소]
            try {
                if (handler != null){
                    handler.removeMessages(0);
                    handler.removeCallbacks(null);
                }
            }
            catch (Exception ex){
                ex.printStackTrace();
            }

        }

        @Override
        public void onUnavailable() { // TODO [네트워크에 연결되지 않은 경우]
            super.onUnavailable();
            S_Log._E_(ACTIVITY_NAME + " :: NetworkCallback :: onUnavailable :: Wifi Connection Fail", null);
            
            // [예약 된 핸들러 작업 취소]
            try {
                if (handler != null){
                    handler.removeMessages(0);
                    handler.removeCallbacks(null);
                }
            }
            catch (Exception ex){
                ex.printStackTrace();
            }


            // [콜백 해제] : [AP 연결 종료]
            try {
                if (connectivityApManager != null){
                    connectivityApManager.unregisterNetworkCallback(this);
                    connectivityApManager = null;
                    connectivityApFlag = false;
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }

        }

        @Override
        public void onLost(Network network) { // TODO [네트워크 연결이 끊겨, 이용이 불가능]
            super.onLost(network);
            S_Log._E_(ACTIVITY_NAME + " :: NetworkCallback :: onLost :: Wifi Connection Lost", null);

            // [예약 된 핸들러 작업 취소]
            try {
                if (handler != null){
                    handler.removeMessages(0);
                    handler.removeCallbacks(null);
                }
            }
            catch (Exception ex){
                ex.printStackTrace();
            }


            // [콜백 해제] : [AP 연결 종료]
            try {
                if (connectivityApManager != null){
                    connectivityApManager.unregisterNetworkCallback(this);
                    connectivityApManager = null;
                    connectivityApFlag = false;
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }

        }

    };



6. connectivityManager.requestNetwork 네트워크 연결 요청 수행

    connectivityApManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    connectivityApManager.requestNetwork(networkRequest, networkCallback);



7. 상단에 선언 된 핸들러에서 타임 아웃 및 연결 실패가 발생 한 경우 >> 와이파이 연결 상태 확인 및 수동으로 네트워크 연결을 해주세요. 알림 팝업창 표시

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






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

[와이파이 활성 및 연결 상태 확인 - 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

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

 

반응형
Comments