스마트기기개발관련/안드로이드 개발

안드로이드 - 안드로이드ConnectivityManager 를 통해 실시간 네트웍 상태 파악하기

AlrepondTech 2012. 1. 11. 15:43
반응형

 출처: http://mainia.tistory.com/549


안드로이드(Android) 단말기에서 ConnectivityManager 를 통해 실시간 네트웍 상태 파악하기

개발환경 : JDK 1.5, Android GoogleAPI 2.1 , eclipse-galileo, window XP

이 예제는 단말기에서 WIFI, 3G 가 되는지에 대한 체크를 위한 것이다.

두가지 정보를 체크할것이다. 하나는 네트웍을 사용할 시점에 WIFI, 3G

사용가능한지에 대한 체크이며 다른 하나는 네트웍상태가 바뀌었을 때

상태변화에 따른 작업을 하기 위한 소스 작업이다.


(1) 네트웍을 사용할 시점에서의 체크

먼저 permission 을 설정한다. 네트웍을 사용하기 위한 permission 은 아래와같다.

이 내용을 AndroidManifest.xml 에 추가한다. INTERNET 만 추가하면 안된다.

ACCESS_NETWORK_STATE 도 추가하기 바란다.


1 <USES-PERMISSION android:name="android.permission.INTERNET">
2 <USES-PERMISSION android:name="android.permission.ACCESS_NETWORK_STATE">
3 </USES-PERMISSION></USES-PERMISSION>

다음은 ConnectivityManager 객체를 통해 WIFI 3G 상태를 체크할수 있는

객체를 반환해서 상태를 체크한다
1 ConnectivityManager manager =
2 (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

WIFI, 3G 인지 구분없이 네트웍 연결상태가 제대로 되었는지에 대한 소스는

아래와 같다. isConnectionted 함수를 써서 확인한다.
01 ConnectivityManager manager =
02 (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
03 NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
04 NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
05
06 if (mobile.isConnected() || wifi.isConnected()){
07 // WIFI, 3G 어느곳에도 연결되지 않았을때
08 Log.d(TAG, "Network connect success");
09 }else{
10 Log.d(TAG, "Network connect fail");
11 }

현재 위의 소스를 돌여서 나온 MOBILE WIFI 의 상태값에 대한 내용이다.

인터넷선이 연결된 컴퓨터에서 테스트 했으니 당연 MOBILE 만 될것이다.

MOBILE(3G) 디버그 상태값





WIFI 상태 디버그 상태값



그럼 MOBILE WIFI 둘중 어떤것에 연결되었는지에 대한 상태에 따라 구현 소스가

틀려진다면 어떻게 해야할까? 그것은 ConnectivityManager getActiveNetworkInfo()

NetworkInfo 객체를 받은후 getTypeName 으로 체크하면 된다. 리턴값으로 String

반환하는데 “MOBILE”, “WIFI” 둘중 하나를 리턴한다.

1 NetworkInfo ni = manager.getActiveNetworkInfo();
2 String netname = ni.getTypeName();
3 if (netname.equals("MOBILE")) {
4 Log.d(TAG, "Network - > " + netname);
5 }else{
6 Log.d(TAG, "Network - > " + netname);
7 }

(2) 실시간 네트웍 상태 변화에 따른 값받기

android.content.BroadcastReceiver 클래스를 상속받아 하나 만든다.

01 import android.content.BroadcastReceiver;
02 import android.content.Context;
03 import android.content.Intent;
04 import android.net.ConnectivityManager;
05 import android.net.NetworkInfo;
06 import android.widget.Toast;
07
08 public class ConnReceiver extends BroadcastReceiver {
09
10 @Override
11 public void onReceive(Context context, Intent intent) {
12 String action = intent.getAction();
13
14 // 네트웍에 변경이 일어났을때 발생하는 부분
15 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
16 ConnectivityManager connectivityManager =
17 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
18 NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
19 NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
20 Toast.makeText(context,"Active Network Type : " + activeNetInfo.getTypeName() , Toast.LENGTH_SHORT).show();
21 Toast.makeText(context,"Mobile Network Type : " + mobNetInfo.getTypeName() , Toast.LENGTH_SHORT).show();
22 }
23 }
24 }

다음은 AndroidManifest.xml recevier 와 필터를 등록한다. 필터는

android.net.conn.CONNECTIVITY_CHANGE 등록하면 된다. 그리고 receiver에는

상속받아 만든 클래스를 넣는다.




댓글./////////////////////////////////////////////////////////////////////////////////////

  1. 지금 TCP/IP 소켓 프로그래밍을 하고 있습니다. 이렇게 안드로이드가 3G인지 WIFI인지 확인이 되면
    3G이냐 TCP/IP냐에 따라 자료를 주고 받는 코딩 자체가 달라지는지요? 내용상으로는 WIFI는 소켓을 그대로 사용하면 되는데 3G는 별도 방법이 있는지요. 몇일째 삽질 중이랍니다.

    지금 분배기를 통해 여러 컴터를 사용하고 있는데 3G를 통한 소켓이 전혀 들어 먹질 않네요. 염치 없지만 관련 부분 소스를 구할 수 있나요? jameshong@hanmail.net

    좋은글 감사합니다.

  2. 드로이 2010/09/14 11:19 댓글주소 수정/삭제 댓글쓰기

    안녕하세요. 저도 위의 글과 비슷한 내용으로 고민하고 있습니다. wifi에서는 TCP/IP소켓으로 연결이 되는데 3g로는 연결이 되지 않습니다. 어떤방법으로 해야 하는지 관련하여 자료가 혹시 있는지 부탁드리고 싶습니다.
    soryoungkim@gmail.com
    좋은 정보 감사합니다.

  3. 아르엔 2011/01/19 16:41 댓글주소 수정/삭제 댓글쓰기

    오!! 지금 한창 안드로이드 네트워크 개발중인데 바로 이걸 찾고 있었어요! 좋은 정보 감사합니다..

  4. 심군 2011/02/28 08:43 댓글주소 수정/삭제 댓글쓰기

    드로이//
    제가 공부한 바로는 달라집니다.
    3G망과 관련된 통신은 telephony 에서 담당하고 일반 WiFi망은 net에서 담당합니다.
    관련 사항은
    android.net 과 anroid.telephony 쪽에서 확인하실 수 있을 것 같습니다.

    혹시 제가 잘못 알고 있으면 알려주세요~

    • 녹두장군 2011/03/04 14:39 댓글주소 수정/삭제

      안녕하세요..조언 감사합니다.
      그런데 위의 내용은 제 스마트 폰인 드로이드로 확인한 것입니다.
      방법은 여러가지가 아닐까요? ^^

      혹시 모르니 다시 확인해 볼께요
      그럼 좋은 하루 되세요 ..
















반응형