एंड्रॉइड में नेटवर्क कनेक्टिविटी मॉनिटरिंग
यह गाइड नेटवर्क स्टेटस चेक करने, बदलावों को सुनने, और कनेक्शन प्रकार (वाई-फाई, मोबाइल, ईथरनेट) निर्धारित करने के मॉडर्न और लिगेसी तरीकों को कवर करता है।
आवश्यक अनुमतियाँ
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- वास्तविक कनेक्टिविटी टेस्ट के लिए -->
लेआउट (activity_main.xml)
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<ImageView
android:id="@+id/ivConnectionStatus"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginBottom="24dp"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/tvConnectionStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="32dp"
android:gravity="center" />
<Button
android:id="@+id/btnCheckNetwork"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="नेटवर्क जांचें" />
</LinearLayout>
MainActivity.java - मॉडर्न API (NetworkCallback)
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private ImageView ivStatus;
private TextView tvStatus;
private Button btnCheck;
private ConnectivityManager connectivityManager;
private ConnectivityManager.NetworkCallback networkCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivStatus = findViewById(R.id.ivConnectionStatus);
tvStatus = findViewById(R.id.tvConnectionStatus);
btnCheck = findViewById(R.id.btnCheckNetwork);
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
btnCheck.setOnClickListener(v -> checkNetworkStatus());
// नेटवर्क बदलावों के लिए रजिस्टर (API 21+)
registerNetworkCallback();
// प्रारंभिक जांच
checkNetworkStatus();
}
private void registerNetworkCallback() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
runOnUiThread(() -> updateNetworkStatus(network));
}
@Override
public void onLost(Network network) {
runOnUiThread(() -> {
tvStatus.setText("कोई कनेक्शन नहीं");
ivStatus.setImageResource(R.drawable.ic_no_connection);
});
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) {
runOnUiThread(() -> updateNetworkStatus(network));
}
};
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
connectivityManager.registerNetworkCallback(request, networkCallback);
}
}
private void checkNetworkStatus() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// API 29+: getActiveNetwork() का उपयोग करें
Network activeNetwork = connectivityManager.getActiveNetwork();
if (activeNetwork != null) {
updateNetworkStatus(activeNetwork);
} else {
showDisconnected();
}
} else {
// लिगेसी API (डीप्रिकेटेड)
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
updateLegacyNetworkInfo(activeNetwork);
} else {
showDisconnected();
}
}
}
private void updateNetworkStatus(Network network) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
showConnected("वाई-फाई कनेक्टेड", R.drawable.ic_wifi);
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
showConnected("मोबाइल डेटा कनेक्टेड", R.drawable.ic_mobile_data);
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
showConnected("ईथरनेट कनेक्टेड", R.drawable.ic_ethernet);
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
showConnected("VPN कनेक्टेड", R.drawable.ic_vpn);
} else {
showConnected("कनेक्टेड", R.drawable.ic_connected);
}
} else {
showDisconnected();
}
}
private void updateLegacyNetworkInfo(NetworkInfo networkInfo) {
switch (networkInfo.getType()) {
case ConnectivityManager.TYPE_WIFI:
showConnected("वाई-फाई कनेक्टेड", R.drawable.ic_wifi);
break;
case ConnectivityManager.TYPE_MOBILE:
showConnected("मोबाइल डेटा कनेक्टेड", R.drawable.ic_mobile_data);
break;
case ConnectivityManager.TYPE_ETHERNET:
showConnected("ईथरनेट कनेक्टेड", R.drawable.ic_ethernet);
break;
default:
showConnected("कनेक्टेड", R.drawable.ic_connected);
}
}
private void showConnected(String message, int drawableRes) {
tvStatus.setText(message);
ivStatus.setImageResource(drawableRes);
}
private void showDisconnected() {
tvStatus.setText("कोई इंटरनेट कनेक्शन नहीं");
ivStatus.setImageResource(R.drawable.ic_no_connection);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (networkCallback != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
}
}
वास्तविक इंटरनेट कनेक्टिविटी टेस्ट (पिंग/HTTP)
नेटवर्क कनेक्टेड होने का मतलब यह नहीं कि इंटरनेट काम कर रहा है:
private void testInternetConnectivity() {
new Thread(() -> {
try {
java.net.URL url = new java.net.URL("https://www.google.com/generate_204");
java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int responseCode = conn.getResponseCode();
boolean hasInternet = (responseCode == 204);
runOnUiThread(() -> {
if (hasInternet) {
tvStatus.setText(tvStatus.getText() + " | इंटरनेट: OK");
} else {
tvStatus.setText(tvStatus.getText() + " | इंटरनेट: विफल");
}
});
} catch (Exception e) {
runOnUiThread(() -> tvStatus.setText(tvStatus.getText() + " | इंटरनेट: त्रुटि"));
}
}).start();
}
Flow/LiveData के साथ रिएक्टिव दृष्टिकोण (Kotlin)
// NetworkMonitor.kt
class NetworkMonitor @Inject constructor(
private val context: Context
) {
private val connectivityManager = context.getSystemService(ConnectivityManager::class.java)
val networkState = MutableStateFlow(NetworkState.UNKNOWN)
fun startMonitoring() {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) {
val state = when {
!capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) -> NetworkState.NO_INTERNET
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> NetworkState.WIFI
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> NetworkState.MOBILE
else -> NetworkState.CONNECTED
}
networkState.value = state
}
override fun onLost(network: Network) {
networkState.value = NetworkState.DISCONNECTED
}
}
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(request, callback)
}
sealed interface NetworkState {
data class WIFI : NetworkState
data class MOBILE : NetworkState
data class CONNECTED : NetworkState
object NO_INTERNET : NetworkState
object DISCONNECTED : NetworkState
object UNKNOWN : NetworkState
}
}
महत्वपूर्ण नोट्स
- API 29+ के लिए
NetworkCallbackअनिवार्य है (लिगेसी API डीप्रिकेटेड) - हमेशा
onDestroy()में कॉलबैक अनरजिस्टर करें - नेटवर्क कनेक्टेड ≠ इंटरनेट उपलब्ध (कैप्टिव पोर्टल, फायरवॉल)
- मीटर्ड नेटवर्क के लिए
NET_CAPABILITY_NOT_METEREDजांचें