본문 바로가기

프로그래밍/안드로이드

3G 관리에 관한 여러가지 정보 [스크랩 자료]

안녕하세요.
이곳저곳에서 자료를 구해 

3G와 WIFI가 모두 OFF 상태일 때 3G망으로 접속하도록 코드를 구현하였습니다.
 public void Connect3G(){
	int ret=0;
	ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
	 if(!cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()
	&& !cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected()) {  
		ret = cm.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI");
	}
}
그리고 브로드캐스트 리시버에서 
ConnectivityManager.CONNECTIVITY_ACTION
일 경우에 실질적으로 IP를 받아 접속 하도록 하였습니다.
 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
	ConnectivityManager connectivityManager = 				(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
	 NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
	NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

	 boolean ret = false;
	String strIP = null;
	 int ipAddress = 0;
	 strIP = getLocalIpAddress();
	 ipAddress = StrtoInt_Ip(strIP);
	ret = connectivityManager.requestRouteToHost(5, ipAddress);
}
 
위와 같이 하면 안테나 영역에 3G로 붙은 것이 정상적으로 나오고,
activeNetInfo와 mobNetInfo의 상태를 확인해봐도 MOBILE로 CONNECTED 되었다고 나옵니다.

그런 상태에서 인터넷으로 아무 사이트를 접속해봐도 웹페이지를 표시할 수 없다고 나타나네요..

또한 환경 설정에서 3G 쪽을 보면 "해제"로 되어 있는 상태입니다.
즉. 안테나 영역엔 3G로 붙었다 하지만 환경 설정엔 "해제"로 되어있습니다.

왜 이런 문제가 생기는지 잘 모르겠습니다.
혹시 위와 같은 상황에서 3G로 정상적인 네트워크가 활성화 되도록 하는 방법 아시는 분 계시면.
답변 좀 부탁드립니다.
 

혹시 안드로이드 SDK 버젼을 몇으로 실행하고 계신가요?
2.1 버젼까지는 안드로이드에서 데이터 네트워크 (3G) 에 대한 제어 라이브러리를 제공하지 않고 있습니다.
때문에 각 통신사에서 나름대로의 방법으로 3G 연결 및 해제에 대한 설정을 제공하고 있구요.
여쭤보고 싶은 게 위에서 사용하신 방식으로 ip를 할당받으신다고 했는데
그럼 통신사로 직접 붙어서 ip address를 할당받으신다는 건가요?; 그게 가능한 지를 모르겠어서요;;
한국은 미국과 달리 이통사에서 ip를 직접 제공하기 때문에
APN 정보를 정확하게 설정해줘야 데이터 네트워크를 정상적으로 이용할 수 있는 거로 알고 있습니다.
그러나 APN 정보에 변이를 주어서 데이터 네트워크를 끊고 연결하는 것은 가능합니다.
답변 정리해드리자면, 
1. 프로요(2.2) 가 적용되지 않은 단말에서 3G 제어는 불가능합니다. (제가 알고 있는 한에서)
2. APN 정보를 수정해서 3G 제어가 가능합니다. (구글 코드 검색에서 APNdroid 를 검색해보세요.)
    단, 이 경우 어플리케이션의 비정상 종료에 대한 대책을 세워두셔야 합니다.

public String getLocalIpAddress() {
  try {
   for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
    NetworkInterface intf = en.nextElement();
    
    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
     InetAddress inetAddress = enumIpAddr.nextElement();
    
     if (!inetAddress.isLoopbackAddress()) {
      return inetAddress.getHostAddress().toString();
     }
    }
   }
  } catch (SocketException ex) {
  }
  return null;
 }
아하. 답변 감사합니다. ^^
저래서 안되는 거였군요.

위에 소느느 IP를 얻어오는 소스입니다.
저렇게 해서는 안되는 것 인가보네요.. ^^
출처 : http://www.androidpub.com/685748