안드로이드에서 인터넷 접속을 확인하는 방법? InetAddress가 시간 초과되지 않습니다


657

내가 가지고 AsyncTask호스트 이름에 대한 네트워크 액세스를 확인하도록되어 그. 그러나 doInBackground()시간이 초과되지 않습니다. 누구나 단서가 있습니까?

public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {

    private Main main;

    public HostAvailabilityTask(Main main) {
        this.main = main;
    }

    protected Boolean doInBackground(String... params) {
        Main.Log("doInBackground() isHostAvailable():"+params[0]);

        try {
            return InetAddress.getByName(params[0]).isReachable(30); 
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;       
    }

    protected void onPostExecute(Boolean... result) {
        Main.Log("onPostExecute()");

        if(result[0] == false) {
            main.setContentView(R.layout.splash);
            return;
        }

        main.continueAfterHostCheck();
    }   
}

5
인터넷 연결을 확인하기 위해 아마도 가장 신뢰할 수있는 방법은 주요 이름 서버 중 하나를 ping하는 것일 수 있습니다 if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) .... 더 나은 구현에 대한 내 대답 을 참조하십시오 . 허용 된 답변 (및 여기의 다른 많은 사람들) 은 인터넷이 아닌 네트워크 연결을 확인합니다 .
Levite


4
Ping 방법을 사용하지 말고 대신 HTTP 검사를 사용하십시오. 일부 네트워크에서는 ICMP가 차단되므로 핑이 작동하지 않습니다. 예 : 그것은 가정 와이파이에서 완벽하게 작동하지만 Vodafone의 네트워크 (헝가리)에서 모바일 데이터를 사용할 때는 그렇지 않습니다. 또는 두 메서드를 폴백으로 결합하지만 -w 또는 -W를 사용하더라도 waitFor ()는 약 20 초 동안 대기하므로주의하십시오.
Tamás Bolvári 2016 년

이것을 확인하십시오 : stackoverflow.com/a/39766506/3806413
0xAliHn

@ TamásBolvári : tcp 레이어에서 처리하는 것이 더 좋습니다. HTTP 요청의 신뢰성으로 ICMP 속도에 근접해야합니다. 이에 따라 "핑 응답"을 편집했습니다.
레위

답변:


553

네트워크 연결 / 인터넷 액세스

  • isConnectedOrConnecting()(대부분의 답변에서 사용됨) 모든 네트워크 연결을 확인 합니다
  • 해당 네트워크에 인터넷이 연결되어 있는지 확인하려면 다음 중 하나를 사용하십시오.

A) 서버 핑 (쉬운)

// ICMP 
public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int     exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    }
    catch (IOException e)          { e.printStackTrace(); }
    catch (InterruptedException e) { e.printStackTrace(); }

    return false;
}

+ 메인 스레드에서 실행할 수 있습니다

- 일부 구형 장치 (Galays S3 등)에서는 작동하지 않으며 인터넷을 사용할 수없는 경우 잠시 차단됩니다.

B) 인터넷 소켓에 연결 (고급)

// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
public boolean isOnline() {
    try {
        int timeoutMs = 1500;
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, timeoutMs);
        sock.close();

        return true;
    } catch (IOException e) { return false; }
}

+매우 빠르고 (어느 쪽이든) 모든 장치에서 작동하며 매우 안정적입니다.

- UI 스레드에서 실행할 수 없습니다

이것은 모든 장치에서 매우 안정적으로 작동하며 매우 빠릅니다. 그래도 별도의 작업 (예 : ScheduledExecutorService또는 AsyncTask) 으로 실행해야합니다 .

가능한 질문

  • 정말 빠르나요?

    예, 매우 빠릅니다 ;-)

  • 인터넷에서 무언가를 테스트하는 것 외에 인터넷을 확인하는 신뢰할 수있는 방법이 없습니까?

    내가 아는 한, 알려주고 답을 수정하겠습니다.

  • DNS가 다운되면 어떻게됩니까?

    Google DNS (예 8.8.8.8:)는 세계에서 가장 큰 공개 DNS입니다. 2013 년 현재 하루 1,300 억 건의 요청을 처리했습니다. 당신의 앱이 아마도 오늘의 이야기가 아닐 수도 있습니다.

  • 어떤 권한이 필요합니까?

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

    그냥 인터넷 액세스-놀람 ^^ (Btw 당신은 여기에 제안 된 방법 중 일부 가이 허락없이 인터넷 액세스에 대한 원격 접착제를 가질 수있는 방법에 대해 생각해 본 적이 있습니까?)

 

추가 : 원샷 AsyncTask

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

    private Consumer mConsumer;
    public  interface Consumer { void accept(Boolean internet); }

    public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }

    @Override protected Boolean doInBackground(Void... voids) { try {
        Socket sock = new Socket();
        sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
        sock.close();
        return true;
    } catch (IOException e) { return false; } }

    @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}

///////////////////////////////////////////////////////////////////////////////////
// Usage

    new InternetCheck(internet -> { /* do something with boolean response */ });

추가 : 원샷 RxJava/RxAndroid예 (코 틀린)

fun hasInternetConnection(): Single<Boolean> {
  return Single.fromCallable {
    try {
      // Connect to Google DNS to check for connection
      val timeoutMs = 1500
      val socket = Socket()
      val socketAddress = InetSocketAddress("8.8.8.8", 53)

      socket.connect(socketAddress, timeoutMs)
      socket.close()

      true
    } catch (e: IOException) {
      false
    }
  }
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
}

///////////////////////////////////////////////////////////////////////////////////
    // Usage

    hasInternetConnection().subscribe { hasInternet -> /* do something */}

22
이것은 코드의 평화입니다! 선불 카드를 사용하는 기기에서 매우 유용합니다! 돈이 떨어지면 인터넷을 사용할 수 있지만 인터넷은 없습니다. 따라서 연결을 확인하는 것만으로는 불가능합니다. 감사합니다!
Blejzer

10
이 접근 방식은 차단 방식이므로 UI ​​therad에서는 실행하지 않아야합니다.
Sergii

36
@Levit 허용되는 답변이어야합니다. 위의 답변은 네트워크 n 인터넷 연결이 아님을 확인합니다 . 그리고 네 이것은 매우 빠릅니다. 감사. 따라서 공감.
Roon13

9
이 솔루션은 모든 장치에서 작동하지 않습니다. @Salmaan이 말한 것처럼 일부 장치는 항상 2를 반환합니다. 테스트 한 장치는 인터넷에 연결되어 있으며 핑 대상은 핑 요청에 응답하는 Google DNS 서버입니다. 일부 공급 업체는 Ping 요청을 허용하지 않는 것 같습니다. 예를 들어 Samsung 10.1 태블릿 (4.3)으로 테스트했는데 솔루션이 작동하지 않습니다. 명령 행 유틸리티를 통해 ping 명령을 실행하면 권한 오류가 발생합니다. 이 명령은 에뮬레이터에서도 작동하지 않습니다. 이 솔루션을 사용하는 데주의하십시오.
Eren Yilmaz

9
이 방법은 모든 전화에서 작동하지는 않습니다. 예를 들어 Samsung Galaxy S3에서는 실패합니다. 여기를 참조하십시오 : 왜 핑이 일부 장치에서는 작동하고 다른 장치에서는 작동하지 않습니까?
Adil Hussain

1032

기기가 비행기 모드 인 경우 (또는 사용 가능한 네트워크가없는 다른 상황 일 경우)로 cm.getActiveNetworkInfo()표시 null되므로 null확인 을 추가해야합니다 .

아래 에서 수정 된 ( Eddie 's solution ) :

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

또한 다음 권한을 다음에 추가하십시오 AndroidManifest.xml.

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

하나의 다른 작은 지점은 주어진 시점에 네트워크 연결이 절대적으로 필요한 경우 netInfo.isConnected()보다 오히려 사용하는 것이 좋습니다 netInfo.isConnectedOrConnecting. 그러나 이것은 개별 사용 사례에 달려 있습니다.


109
imo 네트워크에 연결되어 있지만 실제 인터넷 연결이없는 경우도 있기 때문에 http 시간 초과 예외를 확인해야합니다. VPN에 접속할 수있는 유일한 방법은 VPN과 같습니다. 예를 들어, WI-FI 연결이지만 실제 인터넷 트래픽은 없습니다. 다른 상황은 서버 정지입니다. 이것은 내가 최근에 실행 한 2 가지 문제이며 연결 관리자는 도움이되지 않습니다.
자정

21
자정과 Pintu에 동의합니다.이 답변은 허용되는 답변이 아니어야합니다. 인터넷에 연결되어 있는지 확인하는 것과는 아무런 관련이 없습니다. 예를 들어, 호텔과 같이 포탈 포털을 통해 전화가 WiFi 네트워크에 연결된 경우이 기능은 true를 잘못 반환합니다. 정답은 공용 인터넷에서 서버를 핑하는 것입니다.
Miguel

9
라우터에 인터넷이 작동하지 않을 때 wifi를 통해 라우터에 연결하면 위의 코드가 true를 반환합니다. 그러나, 그렇지 않습니까? 도와 주실 수 있습니까
MoHaN K RaJ

5
컨텍스트를 추가해야했지만 context.getSystemService작동하지 않습니다. 나는 여기에 내 단서를 가지고 androidhive.info/2012/07/...
시스코 코랄 모랄레스에게

1
네트워크 가용성을 확인하는 좋은 방법입니다. 그러나 인터넷 액세스를 확인하는 방법은 무엇입니까?
Tamás Bolvári 2016 년

296

복잡 할 필요는 없습니다. 가장 간단한 프레임 워크 방식은 ACCESS_NETWORK_STATE권한 을 사용 하고 연결된 방법을 만드는 것입니다.

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

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

또한 requestRouteToHost특정 호스트 및 연결 유형 (wifi / mobile)을 염두에두고 사용할 수도 있습니다.

또한 다음이 필요합니다.

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

당신의 안드로이드 매니페스트에서.


82
cm.getActiveNetworkInfo () 수준에서 null 검사를 수행하는 것이 좋습니다. 사용 가능한 활성 네트워크가 없으면 null을 던졌습니다.
사무엘

참조 stackoverflow.com/a/11691676/1979773 requestRouteToHost ()에 대한 깊은 exaplanation에 대한
Spartako

컨텍스트를 추가해야했지만 context.getSystemService작동하지 않습니다. 나는 여기에 내 단서를 얻었습니다 androidhive.info/2012/07/…
Francisco Corrales Morales

9
이 핫스팟에 인터넷이 연결되어 있지 않더라도 WiFi 핫스팟에 연결되어 있으면이 솔루션은 true를 반환합니다.
Josh


63

getActiveNetworkInfo()작업 하려면 매니페스트에 다음을 추가해야합니다.

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

이것은 정답 아래 있어야합니다 (지옥이 무엇인지 알아내는 데 너무 많은 시간이 낭비되었습니다).
Indrek Kõue

2
여기에는 인터넷 권한이 필요하지 않으며 ACCESS_NETWORK_STATE 만 있으면됩니다. 인터넷은 실제로 장치의 라디오 상태를 쿼리하지 않고 원격 위치에 연결하는 경우에만 필요합니다.
Tom

3
귀하의 답변은 현재 실제로 답변이 아니며 다른 답변에 비해 비교적 작은 추가 사항입니다. 다른 모든 답변이 여기에 없다면 귀하의 답변이 의미가 있습니까? 실제로는 아닙니다. 그렇다면 코드 사용법을 설명하는 코드를 사용하여 답변을 확장하거나 답변을 제거하고 다른 답변에 정보를 추가하는 것이 좋습니다 (명예를 잃지 않을 것입니다)
Tim

주의가 될 getActiveNetworkInfo()API 레벨 29에서 더 이상 사용되지 않습니다
스택 오버플로

46

ConnectivityManager 클래스를 살펴보십시오. 이 클래스를 사용하여 호스트의 활성 연결에 대한 정보를 얻을 수 있습니다. http://developer.android.com/reference/android/net/ConnectivityManager.html

편집 : 당신은 사용할 수 있습니다

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

또는

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 

반환 된 NetworkInfo 객체의 DetailedState 열거를 구문 분석합니다.

편집 편집 : 호스트에 액세스 할 수 있는지 확인하려면 다음을 사용할 수 있습니다.

Context.getSystemService(Context.CONNECTIVITY_SERVICE)
    .requestRouteToHost(TYPE_WIFI, int hostAddress)

분명히, 나는 Context.getSystemService (Context.CONNECTIVITY_SERVICE)를 프록시로 사용하고 있습니다.

ConnectivityManager cm = Context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.yourMethodCallHere();

확실하지는 않지만 현재 어떤 종류의 네트워크 연결이 켜져 있는지 테스트하는 코드처럼 보입니다. 예를 들어 WiFi를 사용하는 경우 홈 와이파이 라우터가 인터넷에 연결되어 있다는 보장은 없습니다 ... 실제로 인터넷 서버에 요청을
해야하는지 확인

1
EDIT EDIT 섹션에 실수가 있었고 requestRouteToHost () 호출을 생략했습니다. :) 지금 답을 다시 읽기
Chinmay Kanchi

requestRouteToHost는 더 이상 사용되지 않습니다.
Jahaziel

46

이 코드를 확인하십시오 ... 그것은 나를 위해 일했습니다 :)

public static void isNetworkAvailable(final Handler handler, final int timeout) {
    // ask fo message '0' (not connected) or '1' (connected) on 'handler'
    // the answer must be send before before within the 'timeout' (in milliseconds)

    new Thread() {
        private boolean responded = false;   
        @Override
        public void run() { 
            // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 
            new Thread() {      
                @Override
                public void run() {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try {
                        new DefaultHttpClient().execute(requestForTest); // can last...
                        responded = true;
                    } 
                    catch (Exception e) {
                    }
                } 
            }.start();

            try {
                int waited = 0;
                while(!responded && (waited < timeout)) {
                    sleep(100);
                    if(!responded ) { 
                        waited += 100;
                    }
                }
            } 
            catch(InterruptedException e) {} // do nothing 
            finally { 
                if (!responded) { handler.sendEmptyMessage(0); } 
                else { handler.sendEmptyMessage(1); }
            }
        }
    }.start();
}

그런 다음 핸들러를 정의합니다.

Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if (msg.what != 1) { // code if not connected

        } else { // code if connected

        }   
    }
};

... 그리고 테스트를 시작하십시오 :

isNetworkAvailable(h,2000); // get the answser within 2000 ms

3
Google이 다운 된 것은 무엇입니까? 또한 주어진 작업에는 필요하지 않은 인터넷 권한이 필요합니다. 마지막으로, 데이터를 소비합니다 (중요하지 않은 경우에도). 이것은 단지 그런 멍청이처럼 보입니다.
Tom

28
@Tom 공정하게, 이것은 아마도 유일한 정답 일 것입니다. 다른 예제는 네트워크 연결이 사용 가능한지 및 / 또는 해당 네트워크에 연결되어 있는지 여부 만 보여 주지만 해당 네트워크가 실제로 원격 연결 (예 : 웹 사이트)을 만들 수도 있는지 질문에 대답하지 않습니다 . 그래서 이것은 포스터 Q에 대답하고 다른 대답은 그렇지 않습니다
slinden77

2
@dmmh 예, 안타깝게도 Android API에서 본 것과는 다릅니다. 아마도 간단한 핑이 더 좋을 것입니다. stackoverflow.com/questions/3905358/… . 정말로 염려한다면 핑에 IP 목록을 포함시킬 수도 있습니다 .Google이 다운 될 가능성은 매우 적지 만 같은 날 Google, Bing 및 Yahoo가 다운 될 가능성은 더 적습니다. . 그냥 내 생각
Tom

10
이 점검에는 아무런 의미가 없습니다. 시스템 시간과 네트워크 리소스를 사용하여 Google에 연결하려는 경우 실제로 관심이있는 리소스에 연결하는 대신 해당 시간을 소비 할 수 있습니다.
Benjamin

16
중국에서는 구글이 차단되었습니다 !!
Anthone

26

에서 확인할 수 있고이에서 수정 (!) 링크 :

매니페스트 파일에서 최소한 다음을 추가하십시오.

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

인터넷 액세스 권한이있을 수 있습니다. 연결성을 테스트 할 수있는 부울 함수는 다음과 같습니다.

private boolean checkInternetConnection() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    // test for connection
    if (cm.getActiveNetworkInfo() != null
            && cm.getActiveNetworkInfo().isAvailable()
            && cm.getActiveNetworkInfo().isConnected()) {
        return true;
    } else {
        Log.v(TAG, "Internet Connection Not Present");
        return false;
    }
}

18

나는이 코드를 만들었습니다. 가장 단순하고 부울입니다. 질문함으로써if(isOnline()){

연결이 있고 페이지에 연결할 수 있으면 상태 코드 200(안정된 연결)가 나타납니다.

올바른 추가 확인 INTERNETACCESS_NETWORK_STATE권한.

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return false;
}

6
어쩌면 200을 HttpURLConnection.HTTP_OK로 바꾸어야 할 것입니다.
Yash

5
Google이 다운되면 어떻게 되나요?
Yauraw Gadav

12

그것은 나를 위해 작동합니다 :

네트워크 가용성을 확인하려면

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

인터넷 액세스를 확인하려면

public Boolean isOnline() {
    try {
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
        return reachable;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}

이것은 서버가 작동하는지 확인하는 훌륭한 솔루션입니다. 감사!
Williew

1
isOnline ()은 Wi-Fi 신호가 있지만 인터넷이없는 것처럼 메인 스레드에서 전혀 실행되지 않아야합니다. 너무 오래 걸리고 메인 스레드가 차단됩니다.
초에 humazed

9

여러 가지 방법이 있습니다

첫째, 가장 짧지 만 비효율적 인 방법

네트워크 상태 권한 만 필요

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

그런 다음이 방법

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

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnected();

        return isConnected;

    }

답변에서 볼 수 있듯이 ConnectivityManager솔루션에 방금 추가했습니다.
ConnectivityManager인터넷 액세스가 아닌 네트워크 액세스가있는 경우 모든 사용 이 true를 반환 하는 간단한 방법입니다 .Wi-Fi가 라우터에 연결되어 있지만 라우터에 인터넷이없는 경우 true를 반환하고 연결 가용성을 확인합니다.

둘째, 효율적인 방법

필요한 네트워크 상태 및 인터넷 권한

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

그런 다음이 수업에서

 public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {

        private Context context;

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

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

            ConnectivityManager cm =
                    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

            assert cm != null;
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnected();


            if (isConnected) {
                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();
                    if (urlc.getResponseCode() == 204 &&
                            urlc.getContentLength() == 0)
                        return true;

                } catch (IOException e) {
                    Log.e("TAG", "Error checking internet connection", e);
                    return false;
                }
            } else {
                Log.d("TAG", "No network available!");
                return false;
            }


            return null;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            Log.d("TAG", "result" + result);

            if(result){
                // do ur code
            }

        }


    }

요구 CheckInternetAsyncTask

new CheckInternetAsyncTask(getApplicationContext()).execute();

일부 설명 :-

  • 당신은 인터넷을 확인해야합니다 AsyncTask, 그렇지 않으면 android.os.NetworkOnMainThreadException어떤 경우에는 던질 수 있습니다

  • ConnectivityManager true가 요청을 보내는 경우 네트워크 액세스를 확인하는 데 사용됩니다 (Ping)

  • 에 요청 전송 http://clients3.google.com/generate_204이 잘 알려진 URL을 알고이보다 빠르고 효율적으로보다 HTTP 상태 204 빈 페이지를 반환하는 http://www.google.com읽기 . 웹 사이트가있는 경우 앱 내에서 웹 사이트를 사용하는 경우에만 Google 대신 웹 사이트를 사용하는 것이 좋습니다

  • 타임 아웃 범위를 변경할 수 있습니다 (20ms-> 2000ms), 1500ms가 일반적으로 사용됩니다


2
좋은 질문은 슬프지만 더 많은 포인트가 없다는 것입니다. 정답이어야합니다.
존 프레디 트루 히요 오르테가

나는 안드로이드를 처음 사용합니다. 그러나 이것은 잘 다루어 진 답변이며 더 많은 관심을 얻습니다. @ 7569106
Mazen Embaby

1
최선의 완전한 답변, 감사합니다. 누군가 웹 사이트에 이러한 조건이 urlc.getResponseCode () == 200같아야하고 urlc.getContentLength () == 0
AREF

당신의 두 번째 옵션은 충돌 왜 내가 모르겠어요
nafees ahmed

그것은 응용 프로그램을 동결
nafees 아메드

8

내가 지금까지 본 가장 짧고 가장 깨끗한 방법은 다음과 같아야합니다.

public final static boolean isConnected( Context context )
{   
   final ConnectivityManager connectivityManager = 
         (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );  
   final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();    
   return networkInfo != null && networkInfo.isConnected();
}

추신 : 이것은 호스트를 핑하지 않고 연결 상태 만 검사하므로 라우터에 인터넷이 연결되어 있지 않고 장치가 연결되어 있으면 인터넷이 없지만이 방법은 true를 반환 합니다 .
실제 테스트를 위해서는 HttpHead 요청 (예 : www.google.com)을 실행 하고 200 이상 이면 문제가없고 기기가 인터넷에 연결 되어 있는지 상태를 확인하는 것이 좋습니다 .


이 메소드를 전역 클래스에 넣고 싶었 으므로이 버전을 사용해야했기 때문에 호출 한 활동에서 컨텍스트를 전달할 수있었습니다. 감사!
RyanG

8

내가 사용하는 방법은 다음과 같습니다.

public boolean isNetworkAvailable(final Context context) {
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
}

더 나은 방법은 "연결"되어 있는지 확인하십시오.

public boolean isNetworkAvailable(final Context context) {
    final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}

이 방법을 사용하는 방법은 다음과 같습니다.

if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}

필요한 권한 :

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

https://stackoverflow.com/a/16124915/950427


7

실제 연결이 존재하는지 확인하기위한 모바일 장치의 중요한 사용 사례입니다. 이것은 모바일 사용자가 로그인해야하는 "포털 포털"을 사용하여 Wi-Fi 네트워크에 접속할 때 일반적으로 발생하는 문제입니다. 백그라운드에서이 차단 기능을 사용하여 연결이 존재하는지 확인합니다.

/*
 * Not Thread safe. Blocking thread. Returns true if it
 * can connect to URL, false and exception is logged.
 */
public boolean checkConnectionHttps(String url){
    boolean responded = false;
    HttpGet requestTest = new HttpGet(url);
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 3000);
    HttpConnectionParams.setSoTimeout(params, 5000);
    DefaultHttpClient client = new DefaultHttpClient(params);
    try {
        client.execute(requestTest);
        responded = true;
    } catch (ClientProtocolException e) {
        Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
    } catch (IOException e) {
        Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
        e.printStackTrace();
    }
    return responded;
}

3
엔드 투 엔드 연결을 실제로 확인하려면 +1하십시오. 그러나 "포로 포털"상황의 경우, 로그인하지 않아도 많은 사람들이 위의 테스트를 통과한다는 것을 알았습니다. 어떤 URL을 요청하더라도 로그인 페이지와 200 개의 응답이 나타납니다. 따라서 존재하지 않는 도메인에서 내 페이지를 조회하려고 시도하고 404를 얻도록하십시오. 또는 기존의 알려진 페이지를 방문하여 200을 확보하고 해당 컨텐츠를 확인하십시오. 기대 한 것임을 확인하기 위해 반환됩니다.
GreyBeardedGeek

6

모든 네트워크 연결을 반복하고 사용 가능한 연결이 하나 이상 있는지 확인할 수 있습니다.

public boolean isConnected() {
    boolean connected = false;

    ConnectivityManager cm = 
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                    || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    && ni.isConnected() && ni.isAvailable()) {
                connected = true;
            }

        }
    }

    return connected;
}

6

나를 위해 Activity 클래스에서 연결 상태를 확인하는 것은 좋지 않았습니다.

ConnectivityManager cm =
    (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

사용 가능한 연결 (wifi, 네트워크)이없는 경우 UnknownHostException 예외를 포착합니다 .

JSONObject jObj = null;
Boolean responded = false;
HttpGet requestForTest = new HttpGet("http://myserver.com");
try {
    new DefaultHttpClient().execute(requestForTest);
    responded = true;
} catch (UnknownHostException e) {
    jObj = new JSONObject();
    try {
        jObj.put("answer_code", 1);
        jObj.put("answer_text", "No available connection");
    } catch (Exception e1) {}
    return jObj;
} catch (IOException e) {
    e.printStackTrace();
}

이런 식으로 같은 클래스의 다른 경우와 함께이 경우를 처리 할 수 ​​있습니다 (내 서버는 항상 json 문자열로 응답합니다)


6

그것은 나를 위해 작동합니다. 사용해보십시오.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
        URL url = new URL("http://stackoverflow.com/posts/11642475/edit" );
        //URL url = new URL("http://www.nofoundwebsite.com/" );
        executeReq(url);
        Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show();
    }
    catch(Exception e) {
        Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show();
    }
}

private void executeReq(URL urlObject) throws IOException
{
    HttpURLConnection conn = null;
    conn = (HttpURLConnection) urlObject.openConnection();
    conn.setReadTimeout(30000);//milliseconds
    conn.setConnectTimeout(3500);//milliseconds
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    // Start connect
    conn.connect();
    InputStream response =conn.getInputStream();
    Log.d("Response:", response.toString());
}}

우리는 지금 메인 스레드에서 네트워크에 액세스 할 수 없으므로이 답변을 사용할 수 없습니다.
正宗 白 布鞋

1
API 레벨 11부터는 작동하지 않습니다. 이유 : developer.android.com/reference/android/os/… . 그것이 당신을 위해 작동한다면, 그것은 당신이 오래된 안드로이드 장치 에서이 코드를 실행하고 있음을 의미합니다. (GB 이전).
正宗 白 布鞋

StrictMode.ThreadPolicy policy = 새로운 StrictMode.ThreadPolicy.Builder () .permitAll (). build (); StrictMode.setThreadPolicy (policy); 네트워크 메인 스레드 예외를 피하기 위해 다음 두 줄에 프로그램을 추가하십시오
selva_pollachi

좋아, 나는 이것이 작동하지 않는다고 말해서는 안되며, (구식 또는 엄격 모드 설정으로) 작동 할 수 있다고 말해야하지만 권장하지 않습니다. 이로 인해 ANR이 쉽게 발생할 수 있습니다. (httpurlconnection에서 시간 초과 구성이 너무 높음)
正宗 白 布鞋

나중에 .. 네 말이 맞아 .. 이것도 방법 중 하나이기 때문에 나는 이것을 넣었다.
selva_pollachi

6

이 방법을 사용하면 매우 빠른 방법 (실시간 피드백) 또는 느린 방법 (신뢰할 수있는 1 회 점검)을 선택할 수 있습니다.

public boolean isNetworkAvailable(bool SlowButMoreReliable) {
    bool Result = false; 
    try {
        if(SlowButMoreReliable){
            ConnectivityManager MyConnectivityManager = null;
            MyConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo MyNetworkInfo = null;
            MyNetworkInfo = MyConnectivityManager.getActiveNetworkInfo();

            Result = MyNetworkInfo != null && MyNetworkInfo.isConnected();

        } else
        {
            Runtime runtime = Runtime.getRuntime();
            Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");

            int i = ipProcess.waitFor();

            Result = i== 0;

        }

    } catch(Exception ex)
    {
        //Common.Exception(ex); //This method is one you should have that displays exceptions in your log
    }
    return Result;
}

5

InetAddress 대신이 코드를 사용하고 있습니다.

    try {

        URL url = new URL("http://"+params[0]);

        HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION);
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
        urlc.connect();
        if (urlc.getResponseCode() == 200) {
            Main.Log("getResponseCode == 200");
            return new Boolean(true);
        }
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

IOException이 인터넷에 연결되어 있지 않다는 것을 의미하고 그것이 얼마나 신뢰할 수 있는지 명확하게 밝히면 좋을 것입니다.
Milad.Nozari 2016 년

5

안드로이드 네트워크 / 인터넷 연결 상태를 확인하는 것은 복잡하지 않습니다. 아래 DetectConnection클래스는이 상태를 확인하는 데 도움이됩니다.

import android.content.Context;
import android.net.ConnectivityManager;

public class DetectConnection {
    public static boolean checkInternetConnection(Context context) {
        ConnectivityManager con_manager = (ConnectivityManager) context
                                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (con_manager.getActiveNetworkInfo() != null
            && con_manager.getActiveNetworkInfo().isAvailable()
            && con_manager.getActiveNetworkInfo().isConnected()) {
                return true;
        } else {
            return false;
        }
    }
}

자세한 내용은 Android 네트워크 / 인터넷 연결 상태 확인 방법을 참조하십시오.


5

최선의 접근 방식 :

public static boolean isOnline() {
    try {
    InetAddress.getByName("google.com").isReachable(3);

    return true;
    } catch (UnknownHostException e){
    return false;
    } catch (IOException e){
    return false;
    }
    }

1
나는이 접근법을 좋아하지만 몇 가지를 지적해야한다. isReachable ()은 부울을 반환하므로 try 섹션에서 true를 반환하는 대신 boolean connected = InetAddress.getByName ( "google.com"). isReachable (3); 그런 다음 연결된 상태로 반환하십시오. 또한 isReacheable은 IOException 및 IllegalArgumentException 예외를 발생 시키므로 UnknownHostException을 IllegalArgumentException으로 바꾸고 catch (예외 E)를 포함하는 것이 좋습니다.
Yash

2
그러나 isReachable은 루트 권한이 필요할 수있는 ICMP를 사용하고 일반적으로 최신 시스템에서 실행중인 서비스가없는 포트 7을 사용합니다. 따라서 온라인 서비스로의 경로를 확인하는 가장 좋은 방법은 정기적 인 TCP입니다. 따라서 다운 투표.
Yash

5

다음은 내 Utils수업 코드입니다 .

public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

5
public class Network {

Context context;

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

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

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

}

문제를 읽지 않은 다른 모든 사람들은 실제로 인터넷 연결을 확인하지 않기 때문에 문제를 해결하지 못합니다. 핫스팟으로 인해 인터넷에 접속할 수없는 경우에도 로컬 Wi-Fi 핫스팟에 대한 연결은 true를 반환합니다.
Pedro Pombeiro

5

이 방법을 사용하여 네트워크 가용성을 감지 할 수 있습니다.

public static boolean isDeviceOnline(Context context) {
        boolean isConnectionAvail = false;
        try {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo.isConnected();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isConnectionAvail;
    }

5

@Levit에서 제공하는 솔루션을 적용하고 추가 HTTP 요청을 호출하지 않는 함수를 만들었습니다.

오류를 해결합니다 Unable to Resolve Host

public static boolean isInternetAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork == null) return false;

    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        case ConnectivityManager.TYPE_MOBILE:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        default:
            return false;
    }
    return false;
}

private static boolean isInternet() {

    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        Debug.i(exitValue + "");
        return (exitValue == 0);
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

    return false;
}

이제 이렇게 불러

if (!isInternetAvailable(getActivity())) {
     //Show message
} else {
     //Perfoem the api request
}

4

1
그러나 거기에 설명 된 방법은 실제로 인터넷 연결을 확인하지 않고 연결이 설정되어 있는지 확인합니다 (인터넷에 액세스 할 수 있는지 여부). 그 공식 문서의 제목은 실제로 오도됩니다.
Tiago

2
정보에 대한 링크를 게시하는 것보다 질문에 대한 답변을 제공하는 것이 좋습니다. 연결이 끊어지면 어떻게됩니까? 우리는 대답이 없을 것입니다.
Jose Llausas

4

나는 모든 답변을 받았고 인터넷이 사용 가능한지 먼저 확인하고 인터넷이 사용 가능한지 확인하여 내 활동이 있는지 여부를 확인하는 내 자신의 답변을 제시합니다.

인터넷 연결을 확인하는 데 필요한 모든 방법과 클래스를 포함 시켰습니다.

NetworkUtils.class

public class NetworkUtils {

    public static final int STATUS_CONNECTED = 0 ;

    public static boolean isInternetAvailable(Context ctx){
        ConnectivityManager cm = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }

    public static int isInternetActiveWithPing() {
        try {
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
            int exitValue = process.waitFor();
            return exitValue;
        } catch (Exception ex) {
            return -1;
        }
    }

    public static boolean isInternetActiveWithInetAddress() {
        try {
            InetAddress inetAddress = InetAddress.getByName("www.google.com");
            return inetAddress != null && !inetAddress.toString().equals("");
        } catch (Exception ex) {
            return false;
        }
    }

    public static void displayInternetConnectionMessage(Context ctx){
        Toast.makeText(ctx, "Check Internet Connection", Toast.LENGTH_SHORT).show();
    }
}

아래 코드를 사용하여 인터넷이 활성화되어 있는지 확인할 수 있습니다.

 private void checkInternetConnection() {
        if (NetworkUtils.isInternetAvailable(this)) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (NetworkUtils.isInternetActiveWithPing() == NetworkUtils.STATUS_CONNECTED) {
                        performNetworkingOperations();
                    } else {
                        if (NetworkUtils.isInternetActiveWithInetAddress()) {
                            performNetworkingOperations();
                        } else {
                            displayConnectionMessage();
                        }
                    }
                }
            }).start();

        } else {
            displayConnectionMessage();
        }
    }

    private void performNetworkingOperations() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, "Internet is Available", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void displayConnectionMessage() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                NetworkUtils.displayInternetConnectionMessage(MainActivity.this);
            }
        });
    }

NetworkUtils에서 더 나은 팩 스레딩 및 "강제"개발자가 사용자의 방법을 잘못 사용하지 않도록
Ewoks

하나의 추가 조건을 제거합니다. if ((NetworkUtils.isInternetActiveWithPing () == NetworkUtils.STATUS_CONNECTED) || NetworkUtils.isInternetActiveWithInetAddress ()) {// 네트워크 작업 수행} else {// 오류 메시지}
Jawad Zeb

4

isAvailable () 과 연결되어 있고 isConnected () 와 연결이 가능한지 확인하는 것이 매우 중요합니다.

private static ConnectivityManager manager;

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

네트워크 활성 WiFi 유형을 결정할 수 있습니다 .

public static boolean isConnectedWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

또는 모바일 모빌 :

public static boolean isConnectedMobile(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}

권한을 잊지 마세요 :

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

장치 연결 구성 요소를 요약하면 충돌을 피하기 위해 try / catch 문으로 구성해야합니다. 마찬가지로, 오류 처리에 싸여있는 한 일상적인 HttpURLConnection 호출 만하면 인터넷 연결 여부를 곧 알게 될 것입니다.
rangi

4

코 틀린과 코 루틴

나는에 함수를 배치 ViewModel했다 viewModelScope. 관찰 가능을 사용 LiveData하여 연결에 대한 활동을 알려줍니다.

뷰 모델

 fun checkInternetConnection() {
        viewModelScope.launch {
            withContext(Dispatchers.IO) {
                try {
                    val timeoutMs = 3000
                    val socket = Socket()
                    val socketAddress = InetSocketAddress("8.8.8.8", 53)

                    socket.connect(socketAddress, timeoutMs)
                    socket.close()

                    withContext(Dispatchers.Main) {
                        _connection.value = true
                    }
                }
                catch(ex: IOException) {
                    withContext(Main) {
                        _connection.value = false
                    }
                }
            }
        }
    }
 private val _connection = MutableLiveData<Boolean>()
 val connection: LiveData<Boolean> = _connection

활동

 private fun checkInternetConnection() {
     viewModel.connection.observe(this) { hasInternet ->
         if(!hasInternet) {
             //hasn't connection
         }
         else {
            //has connection
         }
     }
  }

3

인터넷 연결을 확인하는 다음 클래스를 작성하십시오.

public class ConnectionStatus {

    private Context _context;

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

    public boolean isConnectionAvailable() {
        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;
    }
}

이 클래스에는 단순히 연결 상태의 부울 값을 반환하는 메소드가 포함됩니다. 따라서 간단한 용어로, 메소드가 인터넷에 유효한 연결을 찾으면 리턴 값은 true입니다.false 유효한 연결이 경우입니다.

MainActivity의 다음 메소드는 앞에서 설명한 메소드의 결과를 호출하고 사용자에게 그에 따라 조치를 취하도록 프롬프트합니다.

public void addListenerOnWifiButton() {
        Button btnWifi = (Button)findViewById(R.id.btnWifi);

        iia = new ConnectionStatus(getApplicationContext());

        isConnected = iia.isConnectionAvailable();
        if (!isConnected) {
            btnWifi.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
                    Toast.makeText(getBaseContext(), "Please connect to a hotspot",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
        else {
            btnWifi.setVisibility(4);
            warning.setText("This app may use your mobile data to update events and get their details.");
        }
    }

위의 코드에서 결과가 거짓이면 (인터넷 연결이없는 경우) 사용자는 Android Wi-Fi 패널로 이동하여 Wi-Fi 핫스팟에 연결하라는 메시지가 표시됩니다.


3

2015 년 6 월 29 일 업데이트 Xamarin.Android를 사용하고 있고 연결을 확인하려는 경우 여러 플랫폼에서이 기능을 제공하는 Nuget 패키지를 사용할 수 있습니다. 좋은 후보는 여기여기에 있습니다 . [업데이트 종료]

위의 답변은 꽤 좋지만 모두 Java로되어 있으며 거의 ​​모두 연결을 확인합니다. 필자의 경우 특정 유형의 연결과 연결이 필요했고 Xamarin.Android에서 개발 중입니다. 또한 하드웨어 계층의 활동 컨텍스트에 대한 참조를 전달하지 않고 응용 프로그램 컨텍스트를 사용합니다. 누군가가 비슷한 요구 사항을 가지고 여기에 오는 경우를 대비하여 여기 내 해결책이 있습니다. 그래도 전체 테스트를 수행하지 않았습니다. 테스트가 끝나면 답변이 업데이트됩니다.

using Android.App;
using Android.Content;
using Android.Net;

namespace Leopard.Mobile.Hal.Android
{
    public class AndroidNetworkHelper
    {
        public static AndroidNetworkStatus GetWifiConnectivityStatus()
        {
            return GetConnectivityStatus(ConnectivityType.Wifi);
        }

        public static AndroidNetworkStatus GetMobileConnectivityStatus()
        {
            return GetConnectivityStatus(ConnectivityType.Mobile);
        }

        #region Implementation

        private static AndroidNetworkStatus GetConnectivityStatus(ConnectivityType connectivityType)
        {
            var connectivityManager = (ConnectivityManager)Application.Context.GetSystemService(Context.ConnectivityService);
            var wifiNetworkInfo = connectivityManager.GetNetworkInfo(connectivityType);
            var result = GetNetworkStatus(wifiNetworkInfo);
            return result;
        }

        private static AndroidNetworkStatus GetNetworkStatus(NetworkInfo wifiNetworkInfo)
        {
            var result = AndroidNetworkStatus.Unknown;
            if (wifiNetworkInfo != null)
            {
                if (wifiNetworkInfo.IsAvailable && wifiNetworkInfo.IsConnected)
                {
                    result = AndroidNetworkStatus.Connected;
                }
                else
                {
                    result = AndroidNetworkStatus.Disconnected;
                }
            }
            return result;
        } 

        #endregion
    }

    public enum AndroidNetworkStatus
    {
        Connected,
        Disconnected,
        Unknown
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.