메뉴 건너뛰기

조회 수 9935 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

개발을 하다보면 특정 어플의 목적에 따라 와이파이(Wi-Fi)의 상태를 감지해야 할 경우가 있습니다.
그것도 실시간으로 !!!

단순히 어플 시작할 때라던가, 특정 버튼을 눌렀을 때 와이파이의 상태를 체크하는 방법은 간단합니다.
 

01.private boolean isWifiConnected()
02.{
03.    ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
04.    if (connMgr != null)
05.    {
06.        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
07.        if ( (networkInfo != null) && (networkInfo.isAvailable() == true) )
08.        {
09.            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
10.            {
11.                if ( (networkInfo.getState() == State.CONNECTED)
12.                        || (networkInfo.getState() == State.CONNECTING) )
13.                {
14.                    return true;
15.                }
16.            }
17.        }
18.    }
19.     
20.    return false;
21.}


위와 같이 특정 상태에서 와이파이의 연결 상태를 측정할 수 있습니다.


하지만, 이 방식은 위의 저 함수가 호출되었을 때만 값을 불러올 수 있다는 단점이 있습니다.
실시간으로 와이파이 상태가 바뀌는 것을 감지할 수 없다는 것이죠.


그래서, 네트워크 상태를 실시간으로 체크하기 위해서 SnowWiFiMonitor 라는 클래스를 한 번 만들어 보겠습니다.
안드로이드 운영체제로부터 상태 변화 메세지를 받기 위해서는 BroadcastReceiver를 상속 받습니다.

코드는 대략 다음과 같습니다.
 

001.package snowdeer.wifi.monitor;
002. 
003.import android.content.BroadcastReceiver;
004.import android.content.Context;
005.import android.content.Intent;
006.import android.net.ConnectivityManager;
007.import android.net.NetworkInfo;
008.import android.net.wifi.WifiManager;
009. 
010.public class SnowWiFiMonitor extends BroadcastReceiver
011.{
012.    public final static int WIFI_STATE_DISABLED         = 0x00;
013.    public final static int WIFI_STATE_DISABLING        = WIFI_STATE_DISABLED       + 1;
014.    public final static int WIFI_STATE_ENABLED          = WIFI_STATE_DISABLING      + 1;
015.    public final static int WIFI_STATE_ENABLING         = WIFI_STATE_ENABLED        + 1;
016.    public final static int WIFI_STATE_UNKNOWN          = WIFI_STATE_ENABLING       + 1;
017.    public final static int NETWORK_STATE_CONNECTED     = WIFI_STATE_UNKNOWN        + 1;
018.    public final static int NETWORK_STATE_CONNECTING    = NETWORK_STATE_CONNECTED   + 1;
019.    public final static int NETWORK_STATE_DISCONNECTED  = NETWORK_STATE_CONNECTING  + 1;
020.    public final static int NETWORK_STATE_DISCONNECTING = NETWORK_STATE_DISCONNECTED + 1;
021.    public final static int NETWORK_STATE_SUSPENDED     = NETWORK_STATE_DISCONNECTING + 1;
022.    public final static int NETWORK_STATE_UNKNOWN       = NETWORK_STATE_SUSPENDED   + 1;
023.     
024.    public interface OnChangeNetworkStatusListener
025.    {
026.        public void OnChanged(int status);
027.    }
028.     
029.    private WifiManager         m_WifiManager = null;
030.    private ConnectivityManager m_ConnManager = null;
031.    private OnChangeNetworkStatusListener m_OnChangeNetworkStatusListener = null;
032.     
033.    public SnowWiFiMonitor(Context context)
034.    {
035.        m_WifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
036.        m_ConnManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
037.    }
038.     
039.    public void setOnChangeNetworkStatusListener(OnChangeNetworkStatusListener listener)
040.    {
041.        m_OnChangeNetworkStatusListener = listener;
042.    }
043. 
044.    @Override
045.    public void onReceive(Context context, Intent intent)
046.    {
047.        if (m_OnChangeNetworkStatusListener == null)
048.        {
049.            return;
050.        }
051.         
052.        String strAction = intent.getAction();
053.         
054.        if (strAction.equals(WifiManager.WIFI_STATE_CHANGED_ACTION))
055.        {
056.            switch(m_WifiManager.getWifiState())
057.            {
058.            case WifiManager.WIFI_STATE_DISABLED:
059.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_DISABLED);
060.                break;
061.                 
062.            case WifiManager.WIFI_STATE_DISABLING:
063.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_DISABLING);
064.                break;
065.                 
066.            case WifiManager.WIFI_STATE_ENABLED:
067.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_ENABLED);
068.                break;
069.                 
070.            case WifiManager.WIFI_STATE_ENABLING:
071.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_ENABLING);
072.                break;
073.                 
074.            case WifiManager.WIFI_STATE_UNKNOWN:
075.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_UNKNOWN);
076.                break;
077.            }
078.        }
079.        else if (strAction.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
080.        {
081.            NetworkInfo networkInfo = m_ConnManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
082.            if ( (networkInfo != null) && (networkInfo.isAvailable() == true) )
083.            {
084.                if (networkInfo.getState() == NetworkInfo.State.CONNECTED)
085.                {
086.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_CONNECTED);
087.                }
088.                else if (networkInfo.getState() == NetworkInfo.State.CONNECTING)
089.                {
090.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_CONNECTING);
091.                }
092.                else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED)
093.                {
094.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_DISCONNECTED);
095.                }
096.                else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTING)
097.                {
098.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_DISCONNECTING);
099.                }
100.                else if (networkInfo.getState() == NetworkInfo.State.SUSPENDED)
101.                {
102.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_SUSPENDED);
103.                }
104.                else if (networkInfo.getState() == NetworkInfo.State.UNKNOWN)
105.                {
106.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_UNKNOWN);
107.                }
108.            }
109.        }
110.    }
111.}


암튼, 대충 이런 형태의 클래스를 하나 만들어놓고, 사용하면 됩니다.

메인 Activity에서 위의 클래스를 불러와서 사용하는 예제는 다음과 같습니다.

01.package snowdeer.wifi.monitor;
02. 
03.import android.app.Activity;
04.import android.content.IntentFilter;
05.import android.net.wifi.WifiManager;
06.import android.os.Bundle;
07.import android.util.Log;
08. 
09.public class ActSnowWiFiMonitor extends Activity
10.{
11.    private SnowWiFiMonitor m_SnowWifiMonitor = null;
12.     
13.    @Override
14.    public void onCreate(Bundle savedInstanceState)
15.    {
16.        super.onCreate(savedInstanceState);
17.        setContentView(R.layout.main);
18.         
19.        m_SnowWifiMonitor = new SnowWiFiMonitor(this);
20.        m_SnowWifiMonitor.setOnChangeNetworkStatusListener(SnowChangedListener);
21.         
22.        //registerReceiver(m_SnowWifiMonitor, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
23.        registerReceiver(m_SnowWifiMonitor, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
24.    }
25.     
26.    @Override
27.    protected void onDestroy()
28.    {
29.        super.onDestroy();
30.         
31.        unregisterReceiver(m_SnowWifiMonitor);
32.    }
33.     
34.    SnowWiFiMonitor.OnChangeNetworkStatusListener SnowChangedListener
35.        = new SnowWiFiMonitor.OnChangeNetworkStatusListener()
36.    {
37.        @Override
38.        public void OnChanged(int status)
39.        {
40.            switch(status)
41.            {
42.            case SnowWiFiMonitor.WIFI_STATE_DISABLED:
43.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLED");
44.                break;
45.                 
46.            case SnowWiFiMonitor.WIFI_STATE_DISABLING:
47.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLING");
48.                break;
49.                 
50.            case SnowWiFiMonitor.WIFI_STATE_ENABLED:
51.                Log.i("", "[WifiMonitor] WIFI_STATE_ENABLED");
52.                break;
53.                 
54.            case SnowWiFiMonitor.WIFI_STATE_ENABLING:
55.                Log.i("", "[WifiMonitor] WIFI_STATE_ENABLING");
56.                break;
57.                 
58.            case SnowWiFiMonitor.WIFI_STATE_UNKNOWN:
59.                Log.i("", "[WifiMonitor] WIFI_STATE_UNKNOWN");
60.                break;
61.                 
62.            case SnowWiFiMonitor.NETWORK_STATE_CONNECTED:
63.                Log.i("", "[WifiMonitor] NETWORK_STATE_CONNECTED");
64.                break;
65.                 
66.            case SnowWiFiMonitor.NETWORK_STATE_CONNECTING:
67.                Log.i("", "[WifiMonitor] NETWORK_STATE_CONNECTING");
68.                break;
69.                 
70.            case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTED:
71.                Log.i("", "[WifiMonitor] NETWORK_STATE_DISCONNECTED");
72.                break;
73.                 
74.            case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTING:
75.                Log.i("", "[WifiMonitor] NETWORK_STATE_DISCONNECTING");
76.                break;
77.                 
78.            case SnowWiFiMonitor.NETWORK_STATE_SUSPENDED:
79.                Log.i("", "[WifiMonitor] NETWORK_STATE_SUSPENDED");
80.                break;
81.                 
82.            case SnowWiFiMonitor.NETWORK_STATE_UNKNOWN:
83.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLED");
84.                break;
85.         
86.            }
87.        }
88.    };


앗!! 그리고 주의하셔야 할 점은 AndroidManifest.xml 파일에서 권한 설정을 미리 해둬야 한다는 점이겠죠?

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 

 

  1. 감사합니다. 도움이 되는 정말 멋진 글이네요. 그리고 질문 있는데요. interface 부분 SnowWiFiMonitor 클래스에서 implement로 상속받으면서 메소드를 구현하면 안되나요?

  2. Messiah 2012/05/02 12:04  댓글주소 수정/삭제 댓글쓰기

    근데.정말 실시간으로 되는건가요? 제가 코딩을 잘못한건지 와이파이 변화를 감지못하는거 같은데요... 음...


  • Messiah 2012/05/02 15:28  댓글주소 수정/삭제 댓글쓰기

    NETWORK_STATE_CHANGED_ACTION 리시브 받으시려면 이 소스에서 조금 수정하셔야합니다.

    WifiManger 클래스에는 wifi 상태 저 5가지만 체크할수 있습니다.

    따라서 NETWORK_STATE_CHANGED_ACTION은 리시브를 제대로 받을수 없는 것이지요.

    주석처리된 registerReceiver 주석푸시고. ConnectivityManager 를 이용하여 wifi 접속 이벤트 리시브가 오는 것을

    onReceive() 메소드에서 처리 해주시면 됩니다. 저는 그렇게 소스 변경하여서 사용하였습니다.


  • List of Articles
    번호 제목 날짜 조회 수
    257 화면 회전에 따른 애니메이션 효과 구현하기 2015.07.16 8055
    256 화면 해상도에 관계없는 레이아웃(Layout) 만들기 file 2015.07.16 8641
    255 화면 전환해도 데이터 유지 예제 2015.07.26 9204
    254 하이브리드앱 기본 - WebView로 웹페이지 띄우기 file 2020.12.14 1025
    253 하이브리드 앱에서의 세션관리(로그인 상태 유지) 2018.12.27 5002
    252 푸시 서비스(GCM)에 대해 알아보자 file 2015.07.01 7000
    251 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (3) file 2015.07.16 6267
    250 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (2) file 2015.07.16 7292
    249 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (1) file 2015.07.16 6726
    248 폰갭(PhoneGap) 플러그인 사용하기 2015.06.29 7360
    247 폰갭(PhoneGap) 플러그인 만들기 2015.06.29 8436
    246 폰갭(PhoneGap) 에서 페이지들간의 이동 2015.06.29 8473
    245 폰갭(PhoneGap) & jQuery Mobile 로 안드로이드 어플 개발 file 2015.06.29 7839
    244 폰갭 비콘 디텍팅 안될 때 (기본적인건 다 되있어야됨) 2015.07.26 6529
    243 패키지명을 한꺼번에 변경하기 (Refactor) file 2020.12.14 295
    242 특정 폴더에서 오래된 파일 삭제하기 2015.07.16 6767
    241 트리뷰(TreeView) 컨트롤 file 2014.10.16 6722
    240 탭 뷰에 탭 추가하기, 아이콘 넣기 file 2015.07.16 9360
    239 클래스나눠서 xml 파싱과 FTP를이용하여 안드로이드에서 활용하기 2014.08.28 6180
    238 카카오톡 분석하기 (2) - 카카오톡 암호화 함수 찾기 file 2016.05.26 9600
    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
    / 13

    하단 정보를 입력할 수 있습니다

    © k2s0o1d4e0s2i1g5n. All Rights Reserved