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

Android में उपलब्ध Wi-Fi नेटवर्क स्कैन करें और ListView में प्रदर्शित करें

यह ट्यूटोरियल दिखाता है कि 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>

महत्वपूर्ण कार्यान्वयन विवरण

घटकभूमिका
WifiManagerWi-Fi संचालन के लिए मुख्य API (स्कैन, सक्षम/अक्षम)
BroadcastReceiverअसिंक्रोनस स्कैन परिणामों को सुनता है
SCAN_RESULTS_AVAILABLE_ACTIONस्कैन पूरा होने पर प्रसारित Intent Action
ScanResultSSID, BSSID, क्षमताएं, स्तर (सिग्नल शक्ति), आवृत्ति रखता है
ArrayAdapterसरल स्ट्रिंग सूची के लिए ListView को डेटा बांधता है

Android 10+ (API 29+) विचार

  • WifiManager.startScan() गैर-सिस्टम ऐप्स के लिए थ्रॉटेल किया गया है।
  • बेहतर नियंत्रण के लिए WifiManager.requestScan() (API 29+) का उपयोग करने पर विचार करें।
  • Android 10+ पर SSID/BSSID तक पहुंच के लिए स्थान अनुमति अनिवार्य है।
  • Android 11+ (API 30+) पर, ACCESS_FINE_LOCATION की सिफारिश की जाती है।

उन्नयन विचार

  1. RecyclerView का उपयोग करें ListView के बजाय बेहतर प्रदर्शन के लिए।
  2. सिग्नल शक्ति (level), सुरक्षा प्रकार, आवृत्ति बैंड (2.4GHz/5GHz) दिखाएं।
  3. कस्टम एडाप्टर के साथ कस्टम सूची आइटम लेआउट लागू करें।
  4. लाइव अपडेट के लिए आवधिक स्कैनिंग जोड़ें।
  5. परिणामों को SSID या सिग्नल शक्ति के अनुसार क्रमबद्ध/फ़िल्टर करें।

निष्कर्ष

यह कार्यान्वयन Android में Wi-Fi स्कैनिंग के लिए एक पूर्ण, अनुमति-जागरूक आधार प्रदान करता है। मुख्य बातें: उचित अनुमति प्रबंधन, जीवनचक्र-जागरूक रिसीवर पंजीकरण, और स्कैन परिणामों के लिए BroadcastReceiver पैटर्न।

  1. Android में इंस्टॉल ऐप्स की सूची कैसे प्राप्त करें? Android में इंस्टॉल ऐप्स की सूची कैसे प्राप्त करें?

    इंस्टॉल ऐप्स की सूची प्राप्त करना यह उदाहरण दर्शाता है कि PackageManager का उपयोग करके डिवाइस पर इंस्टॉल सभी थर्ड-पार्टी ऐप्स की सूची कैसे प्राप्त करें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट में ListView (activity_main.xml) <?xml version=1.0 encodi

  1. 5 सबसे खतरनाक Android वायरस और उनसे कैसे छुटकारा पाएं 5 सबसे खतरनाक Android वायरस और उनसे कैसे छुटकारा पाएं

    जीवन के सभी क्षेत्रों में, वायरस से संक्रमित होना एक बुरी बात होती है। Android यकीनन अधिक संवेदनशील ऑपरेटिंग सिस्टम में से एक है, और पिछले कुछ वर्षों में कई शोषण हुए हैं। एडवेयर और पॉप-अप से लेकर व्यक्तिगत जानकारी चुराने तक, कई हाई-प्रोफाइल समस्याएं रही हैं। यहां पांच सबसे खतरनाक वायरस की सूची दी ग

  1. एंड्रॉइड P के एम्बिएंट डिस्प्ले में मौसम कैसे प्रदर्शित करें एंड्रॉइड P के एम्बिएंट डिस्प्ले में मौसम कैसे प्रदर्शित करें

    गूगल I/O 2018 सम्मेलन में, कंपनी ने एंड्रॉइड P की कुछ नई और रोमांचक विशेषताओं, क्षमताओं और कार्यक्षमताओं का खुलासा किया। कंपनी ने निश्चित रूप से एंड्रॉइड के एम्बिएंट डिस्प्ले के पीछे की कड़ी मेहनत का प्रदर्शन किया जिसे वे एंड्रॉइड में ला रहे हैं। कंपनी द्वारा अनुकूली बैटरी, जेस्चर नेविगेशन, स्टैंडबा