티스토리 뷰

반응형

안녕하세요 오늘의 포스팅은 바로


안드로이드에서 인터넷이 연결이 되었는지와 실제로 데이터를 가져올수 있는 상태인지를


알아보는 방법에 대해서 설명할텐데요


먼저 기기 에서 WIFI 열결을 켰는지 그리고 실제로 데이터를 가져올수 있는지를 테스트 해보겠습니다..


저의 경우는 그랬습니다 와이파이를 켰고 return 되는 db 주파수값도 좋았었는데 데이터가 안들어온다


무슨말일까요...?? 두대의 모말일기기가 있을때 한쪽에 핫스팟을키고 LTE를 끈상태고


한쪽은 와이파이를 키고 LTE를 끈상태 움... 지하철을 탔는데 와이파이가 잡혀있지만 데이터 전송이 안될떄를


구현하고 싶었던거 였습니다. test 상태는 이렇구요


우리는 말을 믿지 않습니다.. 바로 코드 들어가겠습니다..


먼저 인터넷 환경이 되어야되니 


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




맴버변수 선언


public static final String WIFE_STATE = "WIFE";
public static final String MOBILE_STATE = "MOBILE";
public static final String NONE_STATE = "NONE";




public static String getWhatKindOfNetwork(Context context){
    ConnectivityManager cm = (ConnectivityManager)     context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null) {
        if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
            return WIFE_STATE;
        } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
            return MOBILE_STATE;
        }
    }
return NONE_STATE;
}


여기서 핵심 코드는 바로 getActiveNetworkInfo() 이놈인데요.


해당 정보에 대해서 리턴 해요. 만약 와이파이를 끄고 LTE도 끈다면 null을 리턴하구요


그리고 아까 말했던 지하철 같은 상황


Wifi는 연결 되었지만 로그인, 인증서 등 권한을 획득하지 못한경우


이런경우 ping test를 해야되는데 그냥 웹으로 만들기는 어떻게 하는지몰라 검색해서 찾아봤어요


1.about ping


ping이란, 원하는 네트워크 주소에 신호를 보내, 응답이 도착하는가 확인하는 것이다.

 

 만약 인터넷을 사용하지 못한다면, ping 신호는 도달 하지 못할 것이다.


 안드로이드도 리눅스 기반 이므로, 리눅스 명령어를 통해 ping 을 보낼 수 있는데,


 java 에서는 제공해주는 리눅스 api가 없기 때문에,


 밑단까지 내려가 명령을 줘야한다.  아래의 코드를 보자.


public static final String CONNECTION_CONFIRM_CLIENT_URL = "http://clients3.google.com/generate_204";


선언을 하고




private static class CheckConnect extends Thread{
private boolean success;
private String host;

public CheckConnect(String host){
this.host = host;
}

@Override
public void run() {

HttpURLConnection conn = null;
try {
conn = (HttpURLConnection)new URL(host).openConnection();
conn.setRequestProperty("User-Agent","Android");
conn.setConnectTimeout(1000);
conn.connect();
int responseCode = conn.getResponseCode();
if(responseCode == 204) success = true;
else success = false;
}
catch (Exception e) {
e.printStackTrace();
success = false;
}
if(conn != null){
conn.disconnect();
}
}

public boolean isSuccess(){
return success;
}

}


HTTpURlConnection을 구현하고


마지막으로 ping


public static boolean isOnline() {
CheckConnect cc = new CheckConnect(CONNECTION_CONFIRM_CLIENT_URL);
cc.start();
try{
cc.join();
return cc.isSuccess();
}catch (Exception e){
e.printStackTrace();
}
return false;
}



여기서 중요한게 안드로이드 통신할때 Async thread를 써야되는데


미리 정보를 받을수있게 하던거 아니면 다끝나고 하던가 하는 방법으로 가야하는게 point 입니다.




- 참고한 블로그
출처: http://mommoo.tistory.com/52 [개발자로 홀로 서기]



반응형
댓글