메뉴 건너뛰기

조회 수 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
    번호 제목 날짜 조회 수
    237 HTML5로 나만의 비디오 플레이어 스킨 만들기 -2- JavaScript file 2014.09.04 6312
    236 HTML5로 나만의 비디오 플레이어 스킨 만들기 -3- JavaScript file 2014.09.04 6288
    235 HTML5 드래그 앤 드롭 하기 Drag and Drop file 2014.09.04 7748
    234 HTML5 Web Storage -01- file 2014.09.04 5587
    233 HTML5 Form 공부하기 -1- file 2014.09.04 5841
    232 HTML5 Form 공부하기 -2- file 2014.09.04 6329
    231 HTML5로 게임 만들기 워밍업 file 2014.09.04 6063
    230 HTML5 Better semantic tags file 2014.09.04 5952
    229 HTML5 Geolocation (구글 지도에 현위치 표시하기) file 2014.09.04 6810
    228 jQuery ajax post 요청 text 응답 2014.10.16 6702
    227 JSON(JavaScript Object Notation) - jQuery Ajax - jQuery.getJSON() 메서드 (비동기적으로 JSON파일 로드) file 2014.10.16 6568
    226 jQuery Ajax - jQuery.load() 메서드 (동적으로 원격 페이지 로드) file 2014.10.16 6409
    225 트리뷰(TreeView) 컨트롤 file 2014.10.16 6722
    224 Effects - Stop() 메서드 (애니메이션 효과 멈추기) file 2014.10.16 6225
    223 Effects - Animate() 메서드 (여러가지 효과 동시 처리) file 2014.10.16 30628
    222 Effects - SlideToggle() 메서드 (슬라이드 업/다운) file 2014.10.16 6760
    221 Effects - SlideUp() 메서드 (슬라이드업) file 2014.10.16 5999
    220 Effects - FadeIn() / FadeOut() 메서드 (서서히 보이기 및 숨기기) file 2014.10.16 6069
    219 Effects - Show() / Hide() 메서드 (보이기 및 숨기기) file 2014.10.16 5957
    218 Events - Unbind() 메서드 (이벤트 처리기 해제) file 2014.10.16 5749
    Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
    / 13

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

    © k2s0o1d4e0s2i1g5n. All Rights Reserved