메뉴 건너뛰기

조회 수 10025 추천 수 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
    번호 제목 날짜 조회 수
    97 스토리보드 짜는 방법 file 2015.07.16 15531
    96 탭 뷰에 탭 추가하기, 아이콘 넣기 file 2015.07.16 9426
    95 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (3) file 2015.07.16 6340
    94 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (2) file 2015.07.16 7347
    93 푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (1) file 2015.07.16 6782
    » 네트워크 상태 변화 감지하기(BroadcastReceiver 사용) 2015.07.16 10025
    91 옵션 메뉴 동적으로 생성하기 2015.07.16 6977
    90 EditText의 글자 수 제한 걸기 2015.07.16 13944
    89 사용자 정의 팝업창 띄우기 2015.07.16 6387
    88 체크 박스(CheckBox)의 이미지 바꾸기 2015.07.16 6463
    87 이미지 버튼(ImageButton) 만들기 2015.07.16 7172
    86 이미지의 Orientation를 체크해서 이미지 회전하기 2015.07.16 7725
    85 화면 회전에 따른 애니메이션 효과 구현하기 2015.07.16 8136
    84 화면 해상도에 관계없는 레이아웃(Layout) 만들기 file 2015.07.16 8725
    83 네트워크를 통해 받은 이미지를 파일로 저장하고, 크기 조절해서 불러오기 2015.07.16 6219
    82 특정 폴더에서 오래된 파일 삭제하기 2015.07.16 6927
    81 ScrollView의 활용 2015.07.16 6600
    80 ViewFlipper 사용하기 file 2015.07.16 9689
    79 URL을 이용해서 이미지 다운로드 하기 (멀티 쓰레드 이용) file 2015.07.16 9032
    78 URL을 이용해서 이미지 다운로드 하기 2015.07.16 7472
    Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 Next
    / 13

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

    © k2s0o1d4e0s2i1g5n. All Rights Reserved