IT박스

Android 기기가 인터넷에 연결되어 있는지 감지

itboxs 2020. 6. 27. 11:47
반응형

Android 기기가 인터넷에 연결되어 있는지 감지


장치가 인터넷에 연결되어 있는지 확인해야합니다. 나는 다음과 같은 많은 대답을 발견했다.

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

( Android에서 인터넷에 연결되어 있는지 여부감지하십시오 .)

그러나 인터넷에 액세스 할 수없는 무선 네트워크에 연결된 경우이 방법이 맞지 않습니다 ...이 방법은 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연결하려는 다른 서버 나 가동 시간이 좋은 서버로 URL을 대체 할 수 있습니다 .

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"/>

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");
}

private static NetworkUtil mInstance;
private volatile boolean mIsOnline;

private NetworkUtil() {
    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            boolean reachable = false;
            try {
                Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
                int returnVal = process.waitFor();
                reachable = (returnVal==0);
            } catch (Exception e) {
                e.printStackTrace();
            }
            mIsOnline = reachable;
        }
    }, 0, 5, TimeUnit.SECONDS);
}

public static NetworkUtil getInstance() {
    if (mInstance == null) {
        synchronized (NetworkUtil.class) {
            if (mInstance == null) {
                mInstance = new NetworkUtil();
            }
        }
    }
    return mInstance;
}

public boolean isOnline() {
    return mIsOnline;
}

위의 코드가 도움이되기를 바랍니다. 또한 ur 응용 프로그램에서 인터넷 권한이 있는지 확인하십시오.


으로부터 그렇게 할 수있는 최신 방법 문서는 을 사용하는 ConnectivityManager활성 네트워크를 조회하고 인터넷 연결이 있는지 확인.

public boolean hasInternetConnectivity() {
    ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return (activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting());
}

Add these two permissions to your AndroidManifest.xml file:

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

Check wifi type in connectivity manager:

   //check network connection
    ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean hasNetworkConnection = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    System.out.println("Connection ? : " + hasNetworkConnection);
    //check wifi
    boolean hasWifiConnection = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    System.out.println("Wifi ? : " + hasWifiConnection);

Android Documentation describes 'TYPE_WIFI' as 'A WIFI data connection. Devices may support more than one.'

참고URL : https://stackoverflow.com/questions/6493517/detect-if-android-device-has-internet-connection

반응형