नेटवर्क कनेक्शन / इंटरनेट का उपयोग
isConnectedOrConnecting()
(अधिकांश उत्तरों में प्रयुक्त) किसी भी नेटवर्क कनेक्शन के लिए जाँच
- यह जानने के लिए कि उनमें से किसी भी नेटवर्क में इंटरनेट एक्सेस है या नहीं, निम्न में से किसी एक का उपयोग करें
ए) एक सर्वर पिंग (आसान)
// 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, आदि) पर काम नहीं करता है, अगर कोई इंटरनेट उपलब्ध नहीं है तो यह कुछ समय के लिए अवरुद्ध हो जाता है।
बी) इंटरनेट पर एक सॉकेट से कनेक्ट (उन्नत)
// 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 तक इसने एक दिन में 130 बिलियन अनुरोधों की सेवा दी। चलो बस कहना है, अपने app शायद दिन की बात नहीं होगी।
किन अनुमतियों की आवश्यकता है?
<uses-permission android:name="android.permission.INTERNET" />
बस इंटरनेट का उपयोग - आश्चर्य ^ ^ (बीडब्ल्यूटी क्या आपने कभी इस बारे में सोचा है कि यहां बताए गए कुछ तरीके इंटरनेट की पहुंच के बारे में रिमोट की अनुमति कैसे दे सकते हैं, इस अनुमति के बिना?)
अतिरिक्त: एक-शॉट 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) ...
। इस के एक अच्छे कार्यान्वयन के लिए मेरा जवाब देखें । Btw स्वीकृत उत्तर (और यहां कई अन्य) सिर्फ एक नेटवर्क कनेक्शन की जांच करें , इंटरनेट नहीं।