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