Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में नेटवर्क कनेक्शन स्टेटस कैसे मॉनिटर करें?

एंड्रॉइड में नेटवर्क कनेक्टिविटी मॉनिटरिंग

यह गाइड नेटवर्क स्टेटस चेक करने, बदलावों को सुनने, और कनेक्शन प्रकार (वाई-फाई, मोबाइल, ईथरनेट) निर्धारित करने के मॉडर्न और लिगेसी तरीकों को कवर करता है।

आवश्यक अनुमतियाँ

<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 जांचें
  1. Android में नेटवर्क रोमिंग सक्षम है या नहीं कैसे जांचें? Android में नेटवर्क रोमिंग सक्षम है या नहीं कैसे जांचें?

    Android में TelephonyManager.isNetworkRoaming() का उपयोग करके रोमिंग स्थिति जांचें यह उदाहरण दर्शाता है कि Android में डिवाइस वर्तमान में नेटवर्क रोमिंग पर है या नहीं, इसकी जांच कैसे की जाती है। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project पर जाएं और नया प्रोजेक्ट बनाने के लिए स

  1. एंड्रॉइड में डिवाइस आईडी कैसे प्राप्त करें? एंड्रॉइड में डिवाइस आईडी कैसे प्राप्त करें?

    एंड्रॉइड में डिवाइस आईडी प्राप्त करने का पूरा गाइड यह ट्यूटोरियल आपको एंड्रॉइड ऐप में डिवाइस की यूनिक आईडी (IMEI/MEID) प्राप्त करना सिखाता है। ध्यान दें कि एंड्रॉइड 10 (API 29) से Google ने डिवाइस आईडी एक्सेस पर प्रतिबंध लगा दिए हैं, इसलिए आधुनिक ऐप्स को अन्य पहचानकर्ताओं का उपयोग करना चाहिए। चरण 1

  1. एंड्रॉइड में लाइन कैसे ड्रा करें? (Canvas/Paint) एंड्रॉइड में लाइन कैसे ड्रा करें? (Canvas/Paint)

    एंड्रॉइड में Canvas और Paint से लाइन (और शेप्स) ड्रा करना एंड्रॉइड में कस्टम ड्राइंग के लिए Canvas (ड्राइंग सतह) और Paint (स्टाइल: रंग, चौड़ाई, स्ट्रोक/फिल) उपयोग करते हैं। दो मुख्य दृष्टिकोण हैं: कस्टम View (onDraw() ओवरराइड) — **सिफारिश किया गया**, पुन: उपयोग योग्य, प्रदर्शन अच्छा। Bitmap पर ड्रा