Koneksi jaringan / akses Internet
isConnectedOrConnecting()
(digunakan dalam sebagian besar jawaban) memeriksa koneksi jaringan apa pun
- Untuk mengetahui apakah ada di antara jaringan tersebut yang memiliki akses internet , gunakan salah satu dari yang berikut ini
A) Ping Server (mudah)
// 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;
}
+
bisa berjalan di utas utama
-
tidak berfungsi pada beberapa perangkat lama (Galays S3, dll.), itu memblokir sementara jika tidak ada internet tersedia.
B) Hubungkan ke Socket di Internet (lanjutan)
// 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; }
}
+
sangat cepat (bagaimanapun juga), bekerja pada semua perangkat, sangat dapat diandalkan
-
tidak dapat berjalan di utas UI
Ini bekerja sangat andal, di setiap perangkat, dan sangat cepat. Perlu dijalankan dalam tugas yang terpisah (misalnya ScheduledExecutorService
atau AsyncTask
).
Kemungkinan Pertanyaan
Apakah ini cukup cepat?
Ya, sangat cepat ;-)
Apakah tidak ada cara yang dapat diandalkan untuk memeriksa internet, selain menguji sesuatu di internet?
Tidak sejauh yang saya tahu, tetapi beri tahu saya, dan saya akan mengedit jawaban saya.
Bagaimana jika DNSnya down?
Google DNS (mis. 8.8.8.8
) Adalah DNS publik terbesar di dunia. Per 2013 melayani 130 miliar permintaan per hari. Katakan saja, aplikasi Anda mungkin tidak akan menjadi pembicaraan saat ini.
Izin mana yang diperlukan?
<uses-permission android:name="android.permission.INTERNET" />
Hanya akses internet - kejutan ^^ (Btw apakah Anda pernah memikirkan, bagaimana beberapa metode yang disarankan di sini bahkan dapat memiliki lem jarak jauh tentang akses internet, tanpa izin ini?)
Ekstra: AsyncTask
Contoh Satu Kali
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 */ });
Extra: RxJava/RxAndroid
Contoh Satu Kali (Kotlin)
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) ...
. Lihat jawaban saya untuk implementasi yang lebih baik dari ini. Btw jawaban yang diterima (dan banyak lainnya di sini) hanya memeriksa koneksi jaringan , bukan internet.