यह गाइड Android में WifiManager API का उपयोग करके प्रोग्रामेटिक Wi-Fi नेटवर्क स्कैनिंग को कवर करता है। यह Android 6.0+ के लिए आवश्यक रनटाइम अनुमति प्रवाह, स्कैन ट्रिगरिंग और परिणाम प्रसंस्करण पर केंद्रित है।
मुख्य API घटक
- WifiManager - Wi-Fi संचालन के लिए केंद्रीय वर्ग
- ScanResult - एक पहचाने गए एक्सेस पॉइंट का प्रतिनिधित्व करता है
- BroadcastReceiver - असिंक्रोनस स्कैन पूरा होने की घटनाओं को सुनता है
- SCAN_RESULTS_AVAILABLE_ACTION - परिणाम तैयार होने पर प्रसारित Intent Action
आवश्यक अनुमतियाँ (Manifest)
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
स्कैनिंग कार्यान्वयन
1. WifiManager प्राप्त करें
WifiManager wifiManager = (WifiManager) getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
2. सुनिश्चित करें कि Wi-Fi सक्षम है
if (wifiManager != null && !wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
// नोट: Android 10+ पर, ऐप्स सीधे Wi-Fi सक्षम/अक्षम नहीं कर सकते
// उपयोगकर्ता को सेटिंग्स के माध्यम से सक्षम करने के लिए प्रेरित करें
}
3. स्थान अनुमति जांचें/अनुरोध करें (API 23+)
private static final int PERM_REQUEST = 1001;
private void checkPermissionAndScan() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERM_REQUEST);
} else {
triggerScan();
}
} else {
triggerScan();
}
}
private void triggerScan() {
if (wifiManager != null) {
boolean started = wifiManager.startScan();
if (!started) {
// स्कैन थ्रॉटेल्ड या विफल
}
}
}
4. BroadcastReceiver के साथ परिणाम प्राप्त करें
private BroadcastReceiver scanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
List results = wifiManager.getScanResults();
processResults(results);
}
}
};
private void processResults(List results) {
for (ScanResult result : results) {
String ssid = result.SSID;
String bssid = result.BSSID;
int level = result.level; // dBm में सिग्नल शक्ति
int frequency = result.frequency; // MHz में चैनल आवृत्ति
String capabilities = result.capabilities; // सुरक्षा प्रोटोकॉल
// UI अपडेट करें, RecyclerView एडाप्टर, आदि।
}
}
5. रिसीवर जीवनचक्र प्रबंधन
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(scanReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(scanReceiver);
}
6. अनुमति परिणाम संभालें
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERM_REQUEST && grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
triggerScan();
}
}
ScanResult उपयोगी फ़ील्ड
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
SSID | String | नेटवर्क नाम (उद्धृत) |
BSSID | String | MAC पता |
level | int | सिग्नल शक्ति (dBm, ऋणात्मक) |
frequency | int | चैनल आवृत्ति (MHz) |
capabilities | String | सुरक्षा: WPA2, WEP, खुला, आदि। |
timestamp | long | स्कैन समय (बूट के बाद नैनोसेकंड) |
सिग्नल शक्ति व्याख्या
- > -50 dBm: उत्कृष्ट
- -50 से -60 dBm: अच्छा
- -60 से -70 dBm: उचित
- -70 से -80 dBm: कमजोर
- < -80 dBm: बहुत कमजोर
Android संस्करण-विशिष्ट व्यवहार
| Android संस्करण | व्यवहार |
|---|---|
| Android 6-9 (API 23-28) | मानक स्कैनिंग, स्थान अनुमति आवश्यक |
| Android 10 (API 29) | गैर-सिस्टम ऐप्स के लिए स्कैन थ्रॉटेलिंग; requestScan() पेश किया गया |
| Android 11+ (API 30+) | सख्त अनुमति प्रवर्तन; ACCESS_FINE_LOCATION पसंदीदा |
| Android 12+ (API 31+) | अतिरिक्त गोपनीयता प्रतिबंध; आस-पास के डिवाइस अनुमति विकल्प |
सर्वोत्तम अभ्यास
- जीवनचक्र में रिसीवर पंजीकृत करें -
onResume()/onPause()में,onCreate()/onDestroy()में नहीं - थ्रॉटेलिंग का सम्मान करें - लगातार स्कैन अनुरोध न करें
- परिणामों को कैश करें - हर स्कैन पर UI अपडेट करने से बचें
- खाली परिणामों को संभालें - उपयोगकर्ता को सूचित करें यदि कोई नेटवर्क नहीं मिला
- RecyclerView का उपयोग करें - बड़ी सूचियों के लिए ListView से बेहतर
निष्कर्ष
Android में प्रोग्रामेटिक Wi-Fi स्कैनिंग के लिए उचित अनुमति प्रबंधन, जीवनचक्र-जागरूक BroadcastReceiver पंजीकरण, और Android संस्करण-विशिष्ट व्यवहार की समझ की आवश्यकता होती है। यह पैटर्न Wi-Fi विश्लेषक ऐप्स, ऑटो-कनेक्ट सुविधाओं और नेटवर्क डायग्नोस्टिक टूल्स का आधार बनाता है।