यह ट्यूटोरियल दिखाता है कि Android में WifiManager और BroadcastReceiver का उपयोग करके आसपास के Wi-Fi नेटवर्क को प्रोग्रामेटिक रूप से कैसे स्कैन किया जाए और उन्हें ListView में कैसे प्रदर्शित किया जाए। Android 6.0 (Marshmallow) और इसके बाद के संस्करणों के लिए रनटाइम अनुमतियों को संभालना शामिल है।
आवश्यक अनुमतियाँ
AndroidManifest.xml में निम्नलिखित अनुमतियाँ जोड़ें:
<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" />
नोट: Android 6.0+ (API 23+) पर Wi-Fi स्कैनिंग के लिएACCESS_COARSE_LOCATIONयाACCESS_FINE_LOCATIONकी आवश्यकता होती है।
चरण 1: प्रोजेक्ट बनाएं
Android Studio → New Project → Empty Activity → नाम: WifiScanner।
चरण 2: Main Activity लेआउट
res/layout/activity_main.xml - ListView और Scan बटन के साथ RelativeLayout।
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
tools:context=".MainActivity">
<ListView
android:id="@+id/wifiList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/scanBtn" />
<Button
android:id="@+id/scanBtn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:layout_margin="15dp"
android:text="Scan WiFi" />
</RelativeLayout>
चरण 3: WifiReceiver BroadcastReceiver
src/WifiReceiver.java - स्कैन परिणामों को संभालने के लिए अलग क्लास।
package com.example.wifiscanner;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class WifiReceiver extends BroadcastReceiver {
private final WifiManager wifiManager;
private final ListView wifiDeviceList;
public WifiReceiver(WifiManager wifiManager, ListView wifiDeviceList) {
this.wifiManager = wifiManager;
this.wifiDeviceList = wifiDeviceList;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
List wifiList = wifiManager.getScanResults();
ArrayList deviceList = new ArrayList<>();
for (ScanResult scanResult : wifiList) {
String item = scanResult.SSID + " - " + scanResult.capabilities;
deviceList.add(item);
}
if (deviceList.isEmpty()) {
Toast.makeText(context, "कोई Wi-Fi नेटवर्क नहीं मिला", Toast.LENGTH_SHORT).show();
} else {
ArrayAdapter adapter = new ArrayAdapter<>(
context, android.R.layout.simple_list_item_1, deviceList);
wifiDeviceList.setAdapter(adapter);
}
}
}
}
चरण 4: MainActivity कार्यान्वयन
src/MainActivity.java - अनुमतियाँ, स्कैन ट्रिगर, रिसीवर पंजीकरण संभालता है।
package com.example.wifiscanner;
import android.Manifest;
import android.content.Context;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final int LOCATION_PERMISSION_REQUEST = 1001;
private ListView wifiListView;
private WifiManager wifiManager;
private WifiReceiver wifiReceiver;
private Button scanButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifiListView = findViewById(R.id.wifiList);
scanButton = findViewById(R.id.scanBtn);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// Wi-Fi सक्षम करें यदि बंद है
if (wifiManager != null && !wifiManager.isWifiEnabled()) {
Toast.makeText(this, "Wi-Fi चालू किया जा रहा है...", Toast.LENGTH_LONG).show();
wifiManager.setWifiEnabled(true);
}
scanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestLocationPermissionAndScan();
}
});
}
private void requestLocationPermissionAndScan() {
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},
LOCATION_PERMISSION_REQUEST);
} else {
startWifiScan();
}
} else {
startWifiScan();
}
}
private void startWifiScan() {
if (wifiManager != null) {
boolean success = wifiManager.startScan();
if (!success) {
Toast.makeText(this, "स्कैन प्रारंभ नहीं हो सका", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onPostResume() {
super.onPostResume();
registerWifiReceiver();
// स्वचालित प्रारंभिक स्कैन
requestLocationPermissionAndScan();
}
private void registerWifiReceiver() {
wifiReceiver = new WifiReceiver(wifiManager, wifiListView);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
if (wifiReceiver != null) {
unregisterReceiver(wifiReceiver);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == LOCATION_PERMISSION_REQUEST) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "अनुमति दी गई", Toast.LENGTH_SHORT).show();
startWifiScan();
} else {
Toast.makeText(this, "स्थान अनुमति आवश्यक है", Toast.LENGTH_SHORT).show();
}
}
}
}
चरण 5: AndroidManifest.xml पूर्ण
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.wifiscanner">
<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" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
महत्वपूर्ण कार्यान्वयन विवरण
| घटक | भूमिका |
|---|---|
WifiManager | Wi-Fi संचालन के लिए मुख्य API (स्कैन, सक्षम/अक्षम) |
BroadcastReceiver | असिंक्रोनस स्कैन परिणामों को सुनता है |
SCAN_RESULTS_AVAILABLE_ACTION | स्कैन पूरा होने पर प्रसारित Intent Action |
ScanResult | SSID, BSSID, क्षमताएं, स्तर (सिग्नल शक्ति), आवृत्ति रखता है |
ArrayAdapter | सरल स्ट्रिंग सूची के लिए ListView को डेटा बांधता है |
Android 10+ (API 29+) विचार
WifiManager.startScan()गैर-सिस्टम ऐप्स के लिए थ्रॉटेल किया गया है।- बेहतर नियंत्रण के लिए
WifiManager.requestScan()(API 29+) का उपयोग करने पर विचार करें। - Android 10+ पर SSID/BSSID तक पहुंच के लिए स्थान अनुमति अनिवार्य है।
- Android 11+ (API 30+) पर,
ACCESS_FINE_LOCATIONकी सिफारिश की जाती है।
उन्नयन विचार
- RecyclerView का उपयोग करें
ListViewके बजाय बेहतर प्रदर्शन के लिए। - सिग्नल शक्ति (
level), सुरक्षा प्रकार, आवृत्ति बैंड (2.4GHz/5GHz) दिखाएं। - कस्टम एडाप्टर के साथ कस्टम सूची आइटम लेआउट लागू करें।
- लाइव अपडेट के लिए आवधिक स्कैनिंग जोड़ें।
- परिणामों को SSID या सिग्नल शक्ति के अनुसार क्रमबद्ध/फ़िल्टर करें।
निष्कर्ष
यह कार्यान्वयन Android में Wi-Fi स्कैनिंग के लिए एक पूर्ण, अनुमति-जागरूक आधार प्रदान करता है। मुख्य बातें: उचित अनुमति प्रबंधन, जीवनचक्र-जागरूक रिसीवर पंजीकरण, और स्कैन परिणामों के लिए BroadcastReceiver पैटर्न।