μΉ΄ν…Œκ³ λ¦¬ 보관물: Android

Android

Android κΈ°κΈ°κ°€ 인터넷에 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ 감지 λ°œκ²¬ν–ˆλ‹€. private boolean isNetworkAvailable() {

μž₯μΉ˜κ°€ 인터넷에 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€. λ‚˜λŠ” λ‹€μŒκ³Ό 같은 λ§Žμ€ 닡변을 λ°œκ²¬ν–ˆλ‹€.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
         = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(μ—μ„œ 촬영 μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‚¬μš©ν•  μˆ˜μžˆλŠ” 인터넷 연결이 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ°μ§€ν•©λ‹ˆλ‹€ .)

κ·ΈλŸ¬λ‚˜ 인터넷에 μ•‘μ„ΈμŠ€ ν•  μˆ˜μ—†λŠ” 무선 λ„€νŠΈμ›Œν¬μ— μ—°κ²°λœ 경우이 방법이 λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€ …이 방법은 trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€ … μž₯μΉ˜κ°€ 인터넷에 μ—°κ²°λ˜μ–΄ 있고 μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šμ€μ§€ μ•Œ μˆ˜μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ 무엇인가?



λ‹΅λ³€

λ„€ 말이 λ§žμ•„ 제곡 ν•œ μ½”λ“œλŠ” λ„€νŠΈμ›Œν¬ 연결이 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 인터넷에 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ°€μž₯ 쒋은 방법은 httpλ₯Ό 톡해 μ•Œλ €μ§„ μ„œλ²„μ— 연결을 μ‹œλ„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

λ¬Όλ‘  http://www.google.comμ—°κ²°ν•˜λ €λŠ” λ‹€λ₯Έ μ„œλ²„ λ‚˜ 가동 μ‹œκ°„μ΄ 쒋은 μ„œλ²„λ‘œ λŒ€μ²΄ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ .

Tony Cho도 μ•„λž˜ 주석 μ—μ„œ μ§€μ ν–ˆλ“―μ΄ 메인 μŠ€λ ˆλ“œ μ—μ„œμ΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ NetworkOnMainThread μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€ (Android 3.0 이상). λŒ€μ‹  AsyncTask λ˜λŠ” Runnable을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

google.com을 μ‚¬μš©ν•˜λ €λ©΄ Jeshurun의 μˆ˜μ • 사항을 ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€. 에 그의 λŒ€λ‹΅ κ·ΈλŠ” λ‚΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  μ’€ 더 νš¨μœ¨μ μΈν–ˆλ‹€. 에 μ—°κ²°ν•˜λ©΄

HttpURLConnection urlc = (HttpURLConnection) 
            (new URL("http://clients3.google.com/generate_204")
            .openConnection());

그런 λ‹€μŒ 204에 λŒ€ν•œ 응닡 μ½”λ“œλ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€.

return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);

그런 λ‹€μŒ 전체 Google ν™ˆνŽ˜μ΄μ§€λ₯Ό λ¨Όμ € κ°€μ Έμ˜¬ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.


λ‹΅λ³€

μ—°κ²°λœ WiFi λ„€νŠΈμ›Œν¬μ— 인터넷 μ•‘μ„ΈμŠ€κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ Androidμ—μ„œ 이미 μ‚¬μš©ν•˜λŠ” μ•Œλ €μ§„ 핡을 μ‚¬μš©ν•˜λ„λ‘ THelper의 닡변을 μ•½κ°„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 전체 Google ν™ˆνŽ˜μ΄μ§€λ₯Ό μž‘λŠ” 것보닀 훨씬 νš¨μœ¨μ μž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ—¬κΈ° 및 μ—¬κΈ° λ₯Ό μ°Έμ‘° ν•˜μ‹­μ‹œμ˜€ .

public static boolean hasInternetAccess(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) 
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e(TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(TAG, "No network available!");
    }
    return false;
}

λ‹΅λ³€

public boolean isInternetWorking() {
    boolean success = false;
    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) {
        e.printStackTrace();
    }
    return success;
}

인터넷을 μ‹€μ œλ‘œ μ‚¬μš©ν•  수 있으면 trueλ₯Ό λ°˜ν™˜

이 두 κ°€μ§€ κΆŒν•œμ΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€

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

httpκ°€ μƒˆλ‘œμš΄ μ•ˆλ“œλ‘œμ΄λ“œ λ³΄μ•ˆμœΌλ‘œ 인해 μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©΄ 이제 일반 ν…μŠ€νŠΈ 톡신을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ κ·Έλƒ₯μ§€λ‚˜ μΉ˜λ©΄λ©λ‹ˆλ‹€.

android : usesCleartextTraffic = β€œtrue”


λ‹΅λ³€

Lollipop 이상을 λŒ€μƒμœΌλ‘œν•˜λŠ” 경우 μƒˆλ‘œμš΄ NetworkCapabilities 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public static boolean hasInternetConnection(final Context context) {
    final ConnectivityManager connectivityManager = (ConnectivityManager)context.
            getSystemService(Context.CONNECTIVITY_SERVICE);

    final Network network = connectivityManager.getActiveNetwork();
    final NetworkCapabilities capabilities = connectivityManager
            .getNetworkCapabilities(network);

    return capabilities != null
            && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}

λ‹΅λ³€

λ°˜λ“œμ‹œ 전체 HTTP 연결을 λ§Œλ“€ ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ•Œλ €μ§„ ν˜ΈμŠ€νŠΈμ— λŒ€ν•œ TCP 연결을 μ—΄λ €κ³  μ‹œλ„ν•˜λ©΄ 인터넷에 μ—°κ²°λ˜μ–΄μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

public boolean hostAvailable(String host, int port) {
  try (Socket socket = new Socket()) {
    socket.connect(new InetSocketAddress(host, port), 2000);
    return true;
  } catch (IOException e) {
    // Either we have a timeout or unreachable host or failed DNS lookup
    System.out.println(e);
    return false;
  }
}

그런 λ‹€μŒ ν™•μΈν•˜μ‹­μ‹œμ˜€.

boolean online = hostAvailable("www.google.com", 80);

λ‹΅λ³€

ν—ˆμš© 된 닡변을 기반으둜 λ¦¬μŠ€λ„ˆ 둜이 클래슀λ₯Ό μž‘μ„±ν•˜μ—¬ κΈ°λ³Έ μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

First : λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 인터넷 연결을 ν™•μΈν•œ InterntCheck ν΄λž˜μŠ€λŠ” 결과와 ν•¨κ»˜ λ¦¬μŠ€λ„ˆ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

public class InternetCheck extends AsyncTask<Void, Void, Void> {


    private Activity activity;
    private InternetCheckListener listener;

    public InternetCheck(Activity x){

        activity= x;

    }

    @Override
    protected Void doInBackground(Void... params) {


        boolean b = hasInternetAccess();
        listener.onComplete(b);

        return null;
    }


    public void isInternetConnectionAvailable(InternetCheckListener x){
        listener=x;
        execute();
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
    private boolean hasInternetAccess() {
        if (isNetworkAvailable()) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
                urlc.setRequestProperty("User-Agent", "Android");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                urlc.connect();
                return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Log.d("TAG", "No network available!");
        }
        return false;
    }

    public interface InternetCheckListener{
        void onComplete(boolean connected);
    }

}

λ‘˜μ§Έ : 메인 μŠ€λ ˆλ“œμ—μ„œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜κ³  응닡을 κΈ°λ‹€λ¦½λ‹ˆλ‹€ (Android 용 Firebase API둜 μž‘μ—… ν•œ 경우 μ΅μˆ™ν•΄μ•Όν•©λ‹ˆλ‹€!).

new InternetCheck(activity).isInternetConnectionAvailable(new InternetCheck.InternetCheckListener() {

        @Override
        public void onComplete(boolean connected) {
           //proceed!
        }
    });

이제 onComplete λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ μž₯μΉ˜κ°€ 인터넷에 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


λ‹΅λ³€

이거 ν•œλ²ˆ 해봐

public class ConnectionDetector {
    private Context _context;

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

    public boolean isConnectingToInternet() {
        if (networkConnectivity()) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL(
                        "http://www.google.com").openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(3000);
                urlc.setReadTimeout(4000);
                urlc.connect();
                // networkcode2 = urlc.getResponseCode();
                return (urlc.getResponseCode() == 200);
            } catch (IOException e) {
                return (false);
            }
        } else
            return false;

    }

    private boolean networkConnectivity() {
        ConnectivityManager cm = (ConnectivityManager) _context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            return true;
        }
        return false;
    }
}

λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ— λ‹€μŒ κΆŒν•œμ„ μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€.

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

그런 λ‹€μŒ μ „ν™”ν•˜μ‹­μ‹œμ˜€.

if((new ConnectionDetector(MyService.this)).isConnectingToInternet()){
    Log.d("internet status","Internet Access");
}else{
    Log.d("internet status","no Internet Access");
}

이 글은 Android μΉ΄ν…Œκ³ λ¦¬λ‘œ λΆ„λ₯˜λ˜μ—ˆκ³  λ‹˜μ— μ˜ν•΄ 에 μž‘μ„±λμŠ΅λ‹ˆλ‹€.