티스토리 뷰
안녕하세요 오늘의 포스팅은 바로
안드로이드에서 인터넷이 연결이 되었는지와 실제로 데이터를 가져올수 있는 상태인지를
알아보는 방법에 대해서 설명할텐데요
먼저 기기 에서 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 [개발자로 홀로 서기]
'android' 카테고리의 다른 글
[android] webview scrollbar not visiable (0) | 2017.07.05 |
---|---|
[android] java.lang.IllegalStateException: Unable to create layer for WebView (0) | 2017.06.30 |
[android] back 버튼 2번 눌러서 앱 종료 뒤로가기 (0) | 2017.06.23 |
[android] How to remove button shadow 버튼에 그림자 없애기 (0) | 2017.06.22 |
[android] 라이브러리 설정 (0) | 2017.06.19 |
- Total
- Today
- Yesterday
- swift actor
- Sandbox account sign out
- android notification
- wwdc21 actor
- Sandbox account logout
- Swift textField max length
- Swift 앱 버전
- Swift check notch
- Bundle main infodictionary swift 4
- 맛집
- Android
- firebase remote config
- Swift button underline programmatically
- 쇼미더머니6
- autoclosure
- Swift app version check
- SceneDelegate error
- 위메프
- swift autoclosure
- How to get version swift
- Swift button text underline
- swift uitextfield 글자수 제한
- Sandbox test login on
- Swift label underline storyboard
- Swift version code
- 샤브샤브
- [WindowScene] Failed to Error
- Swift 노치 구분
- iPhone X safe area size
- [WindowScene] Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |