2012-06-16 3 views
3

android 앱을 개발 중이며 인터넷 연결이되어 있는지 확인하는 가장 좋은 방법을 알고 싶습니다. connectivity managernetworkinfo 클래스를 사용해 보았지만 내 앱이 net없이 충돌을 계속 견디지 못하거나 아무렇지도 않게 사용했다면 HttpConnection 메서드를 사용합니다. 누군가 귀중한 제안을 할 수 있습니까?android에서 인터넷 연결을 확인하는 가장 좋은 방법

+0

앱이 중단되는 "그물"이 부족한가요? 라자의 코드가 작동해야합니다. – Austin

+0

그래, 난 에뮬레이터와 전화도 시도했다 –

답변

3
URL myurl = new URL(url); 
    URLConnection connection = myurl.openConnection(); 
    connection.setConnectTimeout(20 * 1000); 
    HttpURLConnection httpConnection = (HttpURLConnection) connection; 
    int responseCode = -1; 
    try { 
     responseCode = httpConnection.getResponseCode(); 
    } catch (Exception e1) {      
      throw e1;     
    } 
    if (responseCode == HttpURLConnection.HTTP_OK) { 
      //connection is OK and do what you want 
      //... 
    } 
    else 
    { 
      //connection is not OK 
      httpConnection.disconnect(); 
    } 
+0

breceive ... 덕분에이 코드와 완벽하게 잘 어울렸다. –

+0

환영합니다 :) – breceivemail

0

그 오래된 질문이지만 내가하고있는 일은 다른 사람들도 유용하게 사용하도록 여기에 응답하는 것입니다. 클래스 아래와 같이 확인 :

if(new ConnectionDetector(context).isConnectedToInternet()){ 
    //Connected 
    //do what you want to do here 
} else{ 
    // Not connected 
    // show appropriate message 
} 
0

Udacity의의 우수한 고급 안드로이드 앱 개발 과정은 getActiveNetworkInfo을 (사용)

:

public class ConnectionDetector { 

    private Context context; 

    public ConnectionDetector(Context context) { 
     this.context = context; 
    } 

    public boolean isConnectedToInternet() { 

     ConnectivityManager connectivity = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 

     } 
     return false; 
    } 
} 

그런 다음 연결을 확인하기 위해 activity에서이 같은 클래스를 method 전화

https://www.udacity.com/course/advanced-android-app-development--ud855

/** 
* @param context Context used to get the ConnectivityManager 
* @return true if network has connectivity (i.e. is reachable), else return false 
*/ 
static public boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return ((activeNetworkInfo != null) 
      && activeNetworkInfo.isConnectedOrConnecting()); 
} 

옆으로 : 천리안의 멋진 대답은 getAllNetworkInfo를 API 수준 23에서 사용 중지되었습니다.

Android 설명서에 getAllNetworks() 및 getNetworkInfo (android.net.Network)가 대신 사용됩니다.

http://developer.android.com/reference/android/net/ConnectivityManager.html#getAllNetworkInfo()

나는 다음과 같이 천리안의 방법을 업데이트하고 내가 위에서 Udacity의의 간단한 isNetworkAvailable 방법을 볼 때까지 그것을 사용.

/** 
* @return true if network has connectivity (i.e. is reachable), else return false 
*/ 
boolean hasConnectivity(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    if (connectivityManager != null) { 
     Network[] networks = connectivityManager.getAllNetworks(); 
     if ((networks != null) 
       && (networks.length > 0)) { 
      for (Network network : networks) { 
       NetworkInfo info = connectivityManager.getNetworkInfo(network); 
       if (info.getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 
0

이 발생되고 어떤 오류 지정 예외를 확인하고 오류를 기반으로 사용자에게 메시지를 표시 할 수 있습니다 제안 임.

try { 
    URL url = new URL("https://google.com"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setConnectTimeout(10000); 
    connection.connect(); 
    success = connection.getResponseCode() == 200; 
} catch (IOException e) { 
    //use the function here 
    onError(this,e); 
} 

public void onError(Activity activity,Throwable e){ 
     try { 
      e.printStackTrace(); 
      FirebaseCrash.report(e); 

      if (e instanceof HttpException) { 
       Response body = ((HttpException) e).response(); 
       if (body.code() == 401) { 
        Toast.makeText(activity, "Not Authorized Access", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 404) { 
        Toast.makeText(activity, "Request not found", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 400) { 
        Toast.makeText(activity, "Bad Request", Toast.LENGTH_SHORT).show(); 
       } else if (body.code() == 500) { 
        Toast.makeText(activity, "Internal Server Error", Toast.LENGTH_SHORT).show(); 
       } else { 
        Log.e(Constants.TAG, "Error : Code HTTP = " + body.code()); 
       } 
      }else if(e instanceof ConnectException || e instanceof SocketException){ 
       Toast.makeText(activity, "No Internet Connection", Toast.LENGTH_SHORT).show(); 
      } else if (e instanceof UnknownHostException) { 
       Toast.makeText(activity, "Make Sure Your Internet Connection is Properly Connected", Toast.LENGTH_SHORT).show(); 
      } else if (e instanceof SSLHandshakeException || e instanceof SSLPeerUnverifiedException) { 
       Toast.makeText(activity, "Server Connection Problem..Please Try Again", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(activity, "Data Load Error", Toast.LENGTH_SHORT).show(); 
      } 
     } 
     catch (Exception ex){ 
      FirebaseCrash.report(e); 
      e.printStackTrace(); 
     } 
    } 
관련 문제