यह व्यापक ट्यूटोरियल आपको Android के WifiManager और BroadcastReceiver API का उपयोग करके एक पूर्ण कार्यात्मक Wi-Fi स्कैनर एप्लिकेशन बनाने के माध्यम से मार्गदर्शन करता है। इसमें अनुमति प्रबंधन, UI अपडेट और आधुनिक Android संस्करणों के लिए सर्वोत्तम अभ्यास शामिल हैं।
ऐप सुविधाएँ
- एक टैप से Wi-Fi नेटवर्क स्कैन करें
- SSID, BSSID, सिग्नल शक्ति, सुरक्षा प्रकार प्रदर्शित करता है
- Android 6.0+ के लिए रनटाइम स्थान अनुमति संभालता है
- यदि अक्षम है तो स्वचालित रूप से Wi-Fi सक्षम करता है (Android 9 तक)
- जीवनचक्र-जागरूक रिसीवर पंजीकरण
पूर्ण स्रोत कोड
1. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.wifiscannerapp">
<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/Theme.WifiScannerApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2. res/layout/activity_main.xml
<?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:padding="16dp"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/wifiRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/scanButton"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/scanButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="16dp"
android:padding="16dp"
android:text="Wi-Fi नेटवर्क स्कैन करें"
android:textSize="16sp" />
</RelativeLayout>
3. res/layout/item_wifi_network.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tvSsid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="13sp"
android:textColor="#757575" />
<TextView
android:id="@+id/tvSignal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="12sp"
android:textColor="#4CAF50" />
</LinearLayout>
4. WifiNetwork मॉडल क्लास
package com.example.wifiscannerapp;
public class WifiNetwork {
public final String ssid;
public final String bssid;
public final int level; // dBm
public final int frequency; // MHz
public final String capabilities;
public WifiNetwork(String ssid, String bssid, int level, int frequency, String capabilities) {
this.ssid = ssid;
this.bssid = bssid;
this.level = level;
this.frequency = frequency;
this.capabilities = capabilities;
}
public String getSignalQuality() {
if (level >= -50) return "उत्कृष्ट";
else if (level >= -60) return "अच्छा";
else if (level >= -70) return "उचित";
else if (level >= -80) return "कमजोर";
else return "बहुत कमजोर";
}
public String getBand() {
return (frequency > 5000) ? "5 GHz" : "2.4 GHz";
}
}
5. WifiNetworkAdapter (RecyclerView.Adapter)
package com.example.wifiscannerapp; import android.net.wifi.ScanResult; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class WifiNetworkAdapter extends RecyclerView.Adapter{ private final List networks = new ArrayList<>(); @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_wifi_network, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { WifiNetwork network = networks.get(position); holder.tvSsid.setText(network.ssid.isEmpty() ? "<छिपा हुआ नेटवर्क>" : network.ssid); holder.tvDetails.setText(String.format("BSSID: %s | %s | %s", network.bssid, network.capabilities, network.getBand())); holder.tvSignal.setText(String.format("सिग्नल: %d dBm (%s)", network.level, network.getSignalQuality())); } @Override public int getItemCount() { return networks.size(); } public void updateNetworks(List scanResults) { networks.clear(); for (ScanResult result : scanResults) { networks.add(new WifiNetwork( result.SSID, result.BSSID, result.level, result.frequency, result.capabilities)); } notifyDataSetChanged(); } static class ViewHolder extends RecyclerView.ViewHolder { TextView tvSsid, tvDetails, tvSignal; ViewHolder(View view) { super(view); tvSsid = view.findViewById(R.id.tvSsid); tvDetails = view.findViewById(R.id.tvDetails); tvSignal = view.findViewById(R.id.tvSignal); } } }
6. MainActivity.java
package com.example.wifiscannerapp;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final int LOCATION_PERM_REQUEST = 2001;
private RecyclerView recyclerView;
private WifiNetworkAdapter adapter;
private WifiManager wifiManager;
private Button scanButton;
private BroadcastReceiver scanReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.wifiRecyclerView);
scanButton = findViewById(R.id.scanButton);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new WifiNetworkAdapter();
recyclerView.setAdapter(adapter);
wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
scanButton.setOnClickListener(v -> requestPermissionAndScan());
// प्रारंभिक स्कैन
requestPermissionAndScan();
}
private void requestPermissionAndScan() {
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, Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_PERM_REQUEST);
} else {
performScan();
}
} else {
performScan();
}
}
private void performScan() {
if (wifiManager == null) return;
if (!wifiManager.isWifiEnabled()) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
wifiManager.setWifiEnabled(true);
Toast.makeText(this, "Wi-Fi सक्षम किया जा रहा है...", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "कृपया सेटिंग्स में Wi-Fi सक्षम करें", Toast.LENGTH_LONG).show();
return;
}
}
boolean success = wifiManager.startScan();
if (!success) {
Toast.makeText(this, "स्कैन थ्रॉटेल्ड या विफल। पुनः प्रयास करें।", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onResume() {
super.onResume();
registerScanReceiver();
}
@Override
protected void onPause() {
super.onPause();
if (scanReceiver != null) {
unregisterReceiver(scanReceiver);
}
}
private void registerScanReceiver() {
scanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
List results = wifiManager.getScanResults();
adapter.updateNetworks(results);
if (results.isEmpty()) {
Toast.makeText(context, "कोई नेटवर्क नहीं मिला", Toast.LENGTH_SHORT).show();
}
}
}
};
IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(scanReceiver, filter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == LOCATION_PERM_REQUEST) {
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (granted) {
performScan();
} else {
Toast.makeText(this, "स्कैनिंग के लिए स्थान अनुमति आवश्यक है", Toast.LENGTH_LONG).show();
}
}
}
}
आधुनिक Android (10+) विचार
| परिवर्तन | प्रभाव | समाधान |
|---|---|---|
| स्कैन थ्रॉटेलिंग | गैर-सिस्टम ऐप्स के लिए सीमित स्कैन आवृत्ति | WifiManager.requestScan() (API 29+) का उपयोग करें |
| MAC रैंडमाइजेशन | गैर-विशेषाधिकार प्राप्त ऐप्स के लिए BSSID यादृच्छिक | BSSID पर निर्भर न रहें |
| Wi-Fi सक्षम/अक्षम | ऐप्स Wi-Fi स्थिति नहीं बदल सकते | उपयोगकर्ता को सेटिंग्स के लिए निर्देशित करें |
| आस-पास के डिवाइस अनुमति | Android 12+ (API 31+) | स्थान के विकल्प के रूप में NEARBY_WIFI_DEVICES का उपयोग करें |
संभावित संवर्द्धन
- स्वचालित रीफ्रेश: आवधिक स्कैनिंग के लिए
HandlerयाWorkManagerजोड़ें - फ़िल्टर/सॉर्ट: सिग्नल शक्ति, बैंड, सुरक्षा के अनुसार क्रमबद्ध करें
- विस्तार दृश्य: टैप पर पूर्ण नेटवर्क विवरण दिखाएं
- निर्यात: CSV/JSON में स्कैन परिणाम सहेजें
- मानचित्र एकीकरण: स्थान डेटा के साथ नेटवर्क प्लॉट करें
निष्कर्ष
यह Wi-Fi स्कैनर कार्यान्वयन आधुनिक Android विकास प्रथाओं का प्रदर्शन करता है: RecyclerView, उचित अनुमति प्रबंधन, जीवनचक्र-जागरूक घटक, और API स्तर अनुकूलन। यह नेटवर्क विश्लेषण टूल्स, ऑटो-कनेक्ट सुविधाओं, या IoT डिवाइस खोज के लिए एक ठोस आधार के रूप में कार्य करता है।