안드로이드 스튜디오

[안드로이드 스튜디오 코틀린] 와이파이 이름, 와이파이 세기 , calculateSignalLevel 사용

권송미 2023. 6. 22. 12:01
728x90
반응형

 

 

 

 

 

https://developer.android.com/reference/android/net/wifi/ScanResult

 

ScanResult  |  Android Developers

 

developer.android.com

 위의 공식문서를 참고합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

우선 와이파이를 알기 위해서는 위치 허용을 해줘야 합니다.

(근처에 있는 와이파이를 알기 위하여)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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)
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형