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

Android के लिए Wi-Fi स्कैनर ऐप विकसित करें

यह व्यापक ट्यूटोरियल आपको 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 का उपयोग करें

संभावित संवर्द्धन

  1. स्वचालित रीफ्रेश: आवधिक स्कैनिंग के लिए Handler या WorkManager जोड़ें
  2. फ़िल्टर/सॉर्ट: सिग्नल शक्ति, बैंड, सुरक्षा के अनुसार क्रमबद्ध करें
  3. विस्तार दृश्य: टैप पर पूर्ण नेटवर्क विवरण दिखाएं
  4. निर्यात: CSV/JSON में स्कैन परिणाम सहेजें
  5. मानचित्र एकीकरण: स्थान डेटा के साथ नेटवर्क प्लॉट करें

निष्कर्ष

यह Wi-Fi स्कैनर कार्यान्वयन आधुनिक Android विकास प्रथाओं का प्रदर्शन करता है: RecyclerView, उचित अनुमति प्रबंधन, जीवनचक्र-जागरूक घटक, और API स्तर अनुकूलन। यह नेटवर्क विश्लेषण टूल्स, ऑटो-कनेक्ट सुविधाओं, या IoT डिवाइस खोज के लिए एक ठोस आधार के रूप में कार्य करता है।

  1. वाईफाई फाइल ट्रांसफर के लिए 4 बेस्ट एंड्रॉइड ऐप्स वाईफाई फाइल ट्रांसफर के लिए 4 बेस्ट एंड्रॉइड ऐप्स

    क्या आप कभी अपने एंड्रॉइड डिवाइस से अपने PC पर (या उससे) फाइल ट्रांसफर करना चाहते थे लेकिन केबल्स और उस तरह की चीजों के साथ छेड़छाड़ करने का समय नहीं था? यदि हां, तो आप इस सूची में कुछ एंड्रॉइड ऐप्स देखना चाह सकते हैं। प्रत्येक एक स्थान से दूसरे स्थान पर फाइलों को वायरलेस तरीके से ट्रांसफर करना बहुत

  1. एंड्रॉइड के लिए टॉप 9 डॉक्यूमेंट स्कैनर ऐप्स - कैप्चर, एडिट और PDF में कनवर्ट करें एंड्रॉइड के लिए टॉप 9 डॉक्यूमेंट स्कैनर ऐप्स - कैप्चर, एडिट और PDF में कनवर्ट करें

    क्या आप अपने एंड्रॉइड फोन का उपयोग करके दस्तावेजों को स्कैन करना चाहते हैं? इस गाइड में, हम एंड्रॉइड के लिए सर्वश्रेष्ठ डॉक्यूमेंट स्कैनर ऐप्स पर चर्चा करेंगे ताकि दस्तावेजों, छवियों आदि को स्कैन किया जा सके। आप इन्हीं ऐप्स का उपयोग करके इन स्कैन किए गए दस्तावेजों को एडिट भी कर सकते हैं, और उनमें से

  1. PC के लिए टॉप 12 Android OS विकल्प: प्रदर्शन बढ़ाएं और ऐप एक्सेस PC के लिए टॉप 12 Android OS विकल्प: प्रदर्शन बढ़ाएं और ऐप एक्सेस

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