Notice
Recent Posts
Recent Comments
Link
투케이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
// --------------------------------------------------------------------------------------
반응형
'투케이2K 로직정리' 카테고리의 다른 글
Comments