MAUI에서 Android기반으로 WiFi 목록을 검색하는 방법이 있나요?

maui로 삽질하고 있는 와중… Android로 와이파이의 ssid와 pw를 직접 입력하여 연결하는 것은 이미 성공했지만, 근처에 신호가 잡히는 와이파이 목록을 구현하는 것에서 어려움을 겪는 중입니다.

WiFiManager의 StartScan을 사용하라는 공식 문서와 여러 참고 코드들을 봤지만 실행되지 않아요.
참고로 Manifest에서 권한은 전부 설정해 준 상태입니다.

Android 13을 기반으로 개발하고 있으며 NET7.0을 기반으로 개발중이에요.

var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService);

var wifiScanReceiver = new WifiScanReceiver(wifiManager);
Android.App.Application.Context.RegisterReceiver(wifiScanReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));

                    wifiManager.StartScan();

다른 성공 사례나 방법이 있나요…?

위의 간략한 예제를 사용해도 결과는 항상 ScanCount가 0입니다…

2 Likes

음… 샘플이 없어서 문제를 특정하기 어려운데요, 2가지를 예상해봅니다.

  • 권한 설정 문제
  • 코드에 문제가 있는 경우

참고로 Manifest에서 권한은 전부 설정해 준 상태입니다.

권한 설정은 어떻게 되어있나요? AndroidManifest에 정의하고, 사용자 동의를 받았나요?
앱 설정에 들어가면 권한 항목이 나오는데, 설정 되어있나요?
앱 설정에서 권한 설정이 되어있으면, 코드 문제일 것 같네요.


랩핑?된 안드로이드 문서에 MAUI 항목이 없어서 (참조할 문서가 없ㅅ),
Xamarin 예제를 써도 될 것 같습니다. => 예제 링크 stack overflow

WiFiManager의 StartScan을 사용하라는 공식 문서와 여러 참고 코드들을 봤지만

사진과 같이 문서를 통해 Android 코드를 확인하고 (Android) Developers 문서 가이드를 따라가면서 구현하는 것도 하나의 방법입니다.



참조

일단 앱 설정에서 수동으로 권한 설정하고 테스트 해보시면 될 것 같아요.

  • android namespace in .NET
  • Developers Wifi scanning [Java]
3 Likes

와… 디버깅 중인 앱에서 권한이 켜져있지 않아서 발생한 문제였네요.
올려주신 사진을 참고하여 앱 권한에서 [위치]를 허용으로 하였더니 와이파이가 찾아집니다.

정말 감사해요!

혹시라도 같은 문제를 고민중일 사람들을 위해 코드도 같이 올립니다.

#if ANDROID
private async void GET_AndroidWiFiList()
{
 WifiManager wifiManager = (WifiManager)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity.GetSystemService(Context.WifiService);
    WifiScanReceiver wifiScanReceiver = new WifiScanReceiver(wifiManager);

    // Start a Wi-Fi scan
    while (!IsWiFiSearch)
    {
        wifiManager.StartScan();

        Console.WriteLine($"wifiManager.ScanResults: {wifiManager.ScanResults}");

        List<ScanResult> scanResults = wifiManager.ScanResults.ToList<ScanResult>();
        Console.WriteLine($"scanResults: {scanResults.ToList()}");

        await Task.Delay(500);

    	if(IsWiFiSearch){
            IsWiFiSearch = false;

            break;
        }
    }
    
    
    // Register this broadcast receiver.
    Microsoft.Maui.ApplicationModel.Platform.CurrentActivity.RegisterReceiver(wifiScanReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
}

public class WifiScanReceiver : BroadcastReceiver
{
    private WifiManager wifiManager;

    public WifiScanReceiver(WifiManager wifiManager)
    {
         this.wifiManager = wifiManager;
    }
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action.Equals(WifiManager.ScanResultsAvailableAction))
        {
            List<ScanResult> scanResults = wifiManager.ScanResults.ToList<ScanResult>();
            if (scanResults!=null)
            {
                foreach (ScanResult scanResult in scanResults)
                {
                    Console.WriteLine(scanResult.Ssid.ToString());
                }
            }
         
        }
    }
}
#endif
3 Likes

해결되어 축하드립니다 :grinning:

와… 디버깅 중인 앱에서 권한이 켜져있지 않아서 발생한 문제였네요.
올려주신 사진을 참고하여 앱 권한에서 [위치]를 허용으로 하였더니 와이파이가 찾아집니다.


안드로이드 매니페스트에 정의하고 사용자 동의를 받지 않아서 권한 획득 실패로 보여 집니다.
위치 권한 설정하려면 사진과 같이 사용자 동의를 받아야합니다.


참조


권한 Level에 따라 사용자 동의가 필요합니다.


사용자의 동의가 필요한 권한이고 4번을 건너뛰었기 때문에 발생한 문제로 보이네요.

3 Likes

그래서 핸드폰 어플들은 반드시 사용자 동의를 첫 앱 시작시에 주는 거였군요 덕분에 해결하였습니다. 감사해요 ㅎㅎ

2 Likes

사실 앱 시작시에 권한을 요구하는건 안드로이드 문서에서 설명하는 기본원칙에 위배되는 행위입니다. 아직까지 이걸로 스토어에서 내려지거나 하진 않는 것 같은데 가능한 해당 권한이 필요한 기능을 사용자가 시작할 때 요청하는 것을 기본으로 합니다 ㅎㅎ