https://developer.android.com/reference/android/net/wifi/ScanResult
위의 공식문서를 참고합니다.
우선 와이파이를 알기 위해서는 위치 허용을 해줘야 합니다.
(근처에 있는 와이파이를 알기 위하여)
AndroidManifest.xml에
<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"/>
퍼미션을 추가해 줍니다.
activity_main.xml에 wifi 정보를 보여줄 TextView를 하나 생성해 줍니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/wifiTV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity에 퍼미션을 체크해 주는 함수를 만들어 줍니다.
private fun checkPermissions() {
val arrayPermission = arrayOf(Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE,Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
val permission = mutableMapOf<String, String>()
permission["WIFI"] = Manifest.permission.ACCESS_WIFI_STATE
permission["CHANGEWIFI"] = Manifest.permission.CHANGE_WIFI_STATE
permission["FINELOCATION"] = Manifest.permission.ACCESS_FINE_LOCATION
permission["COARSELOCATION"] = Manifest.permission.ACCESS_COARSE_LOCATION
val denied = permission.count { ContextCompat.checkSelfPermission(this, it.value) == PackageManager.PERMISSION_DENIED }
if (denied > 0) {
requestPermissions(permission.values.toTypedArray(), 100)
} else {
ActivityCompat.requestPermissions(this, arrayPermission, 400)
}
}
private lateinit var wifiManager: WifiManager
lateinit으로 wifiManager를 해준 뒤
onCreate에 초기화를 해줍니다.
// wifiManager 초기화
wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
val results: List<ScanResult> = wifiManager.scanResults
Log.e("WIFI Test", "$results")
Scan 결과를 출력해서 무슨 값을 알 수 있는지 확인을 해줍니다.
-> 결과 :
[SSID: "AndroidWifi",
BSSID: 00:13:10:85:fe:01,
capabilities: [ESS],
level: -50,
frequency: 2447,
timestamp: 2204117025,
distance: ?(cm),
distanceSd: ?(cm),
passpoint: no,
ChannelBandwidth: 0,
centerFreq0: 2447,
centerFreq1: 0,
standard: 11n,
80211mcResponder: is not supported,
Radio Chain Infos: null,
interface name: wlan0]
위와 같은 결과를 볼 수 있습니다.
SSID : 와이파이 이름
BSSID : The address of the access point -> 무선 네트워크에서 특정 Wi-Fi 액세스 포인트를 고유하게 식별하는 주소입니다.
level : 와이파이 세기
세기에 대한 설명이 공식 문서에 잘 나와 있습니다.
calculateSignalLevel(level) 값을 이렇게 넣어주면 와이파이 세기가 0~4까지 값으로 나오게 됩니다.
for(result in results) {
val signalLevel: Int = result.level
val calLevel =wifiManager.calculateSignalLevel(signalLevel)
binding.wifiTV.text = "SSID : ${result.wifiSsid}, \n와이파이 세기 : ${calLevel}, \nBSSID: ${result.BSSID} "
}
이렇게 텍스트 뷰에 보여주면
이렇게 잘 찍히는 것을 볼 수 있습니다.
MainActivity.kt 전체 코드
package com.example.wifilisttest
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.wifilisttest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var wifiManager: WifiManager
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
@SuppressLint("MissingPermission", "SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 퍼미션 허용
checkPermissions()
// wifiManager 초기화
wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
val results: List<ScanResult> = wifiManager.scanResults
Log.e("WIFI Test", "$results")
for(result in results) {
val signalLevel: Int = result.level
val calLevel =wifiManager.calculateSignalLevel(signalLevel)
binding.wifiTV.text = "SSID : ${result.wifiSsid}, \n와이파이 세기 : ${calLevel}, \nBSSID: ${result.BSSID} "
}
}
private fun checkPermissions() {
val arrayPermission = arrayOf(Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE,Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
val permission = mutableMapOf<String, String>()
permission["WIFI"] = Manifest.permission.ACCESS_WIFI_STATE
permission["CHANGEWIFI"] = Manifest.permission.CHANGE_WIFI_STATE
permission["FINELOCATION"] = Manifest.permission.ACCESS_FINE_LOCATION
permission["COARSELOCATION"] = Manifest.permission.ACCESS_COARSE_LOCATION
val denied = permission.count { ContextCompat.checkSelfPermission(this, it.value) == PackageManager.PERMISSION_DENIED }
if (denied > 0) {
requestPermissions(permission.values.toTypedArray(), 100)
} else {
ActivityCompat.requestPermissions(this, arrayPermission, 400)
}
}
}
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오 코틀린] WebSocket Server 생성하기 (0) | 2023.07.07 |
---|---|
[안드로이드 스튜디오 코틀린] 내부 저장소 용량, 사용 가능한 용량 구하는 예제 (0) | 2023.06.22 |
[안드로이드 스튜디오 코틀린] 버튼 누르면 다른 앱으로 이동하기, getLaunchIntentForPackage not working (0) | 2023.06.13 |
[안드로이드 스튜디오 코틀린] webview -> 갤러리에서 사진 가져오기 (0) | 2023.05.24 |
[안드로이드 스튜디오 코틀린] 두 좌표 사이 거리 구하기 (0) | 2023.05.23 |