네트워크 연결 / 인터넷 액세스
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 */}
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. 더 나은 구현에 대한 내 대답 을 참조하십시오 . 허용 된 답변 (및 여기의 다른 많은 사람들) 은 인터넷이 아닌 네트워크 연결을 확인합니다 .