Wifi 관련 개발을 하는 중 Android 8,9,12 차이가 존재하는 것을 알게 되어서 정보 공유를 위해 포스팅합니다.
1. startScane()
먼저 WifiManager 중 startScane이 Android 9에서부터 Deprecated 되었다.
개발자는 아래와 같은 이유로 Deprecated했다고 한다.
"우리는 앱이 네트워크 성능을 개선하고 배터리 수명을 개선하기 위해 요청할 수 있는 스캔 수를 추가로 제한하고 있습니다.
WifiManager.startScan() 사용은 다음으로 제한됩니다. 각 포그라운드 앱은 2분마다 4번 스캔으로 제한됩니다. 결합된 모든 백그라운드 앱은 30분마다 한 번 스캔으로 제한됩니다. "
"We are further limiting the number of scans apps can request to improve network performance and improve battery life. The WifiManager.startScan() usage is limited to: - Each foreground app is restricted to 4 scans every 2 minutes. - All background apps combined are restricted to one scan every 30 minutes."
결론은 배터리 수명 및 네트워크 성능에 문제가 있어서 Deprecated했다고 한다.
출처 - WIFI 검색 정보 제한사항
2. getConnectionInfo()
getConnectionInfo는 안드로이드 12에서 deprecated되었다. 이유를 찾아보았지만, 자세한 이유는 나오지 않았고 추측만 할 수 있었다.
공식 문서에서는 이 API를 계속 사용할 수 있지만, WifiInfo에서 위치에 민감한 데이터를 마스킹하는 기능과 같은 최신 기능은 이 API를 통해 지원되지 않는다. 라고 적혀있다.
"Apps can continue using this API, however newer features such as ability to mask out location sensitive data in WifiInfo will not be supported via this API."
getConnectionInfo()는 최신 기능을 사용하지 못하는 API인 것 같고 추후에는 새로운 API를 사용해야할 것 같다.
출처 - wifimanger, getConnectionInfo()
코드 예시
val manager = requireContext().getSystemService(Context.WIFI_SERVICE) as WifiManager
val scanResults: List<ScanResult> = manager.scanResults
// 지금 연결된 wifi ssid 얻기
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
val networkCallback = object : ConnectivityManager.NetworkCallback(
FLAG_INCLUDE_LOCATION_INFO
) {
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
val wifiInfo = networkCapabilities.transportInfo as WifiInfo
val ssid = wifiInfo.ssid
}
}
val connectivityManager = this.requireContext()
.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerNetworkCallback(request, networkCallback)
// 와이파이 검색 후 ssid 같은 거 찾기
for (scanResult in scanResults) {
if (scanResult.wifiSsid.toString() == "MY_SSID") {
val wifiNetworkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid(scanResult.wifiSsid.toString())
.setWpa2Passphrase("password")
.build()
val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifier)
.build()
connectivityManager.requestNetwork(
networkRequest,
ConnectivityManager.NetworkCallback()
)
}
}
'안드로이드 > 잡다한 지식' 카테고리의 다른 글
[안드로이드] DroidKnight 2023 (0) | 2023.08.16 |
---|---|
[안드로이드] 안드로이드 14 베타 1 알아보기 - 1 (2) | 2023.05.26 |
[안드로이드] AsyncTask가 Deprecated된 이유 (0) | 2023.05.19 |
[kotlin] 데이터 클래스 활용법 (0) | 2023.05.18 |
[안드로이드] Compose Pager에서 swipe시 렉 (0) | 2023.05.06 |