কম্পিউটার টিউটোরিয়াল

Kotlin ব্যবহার করে Android-এ প্রোগ্রামেটিক্যালি Wi-Fi নেটওয়ার্কে কানেক্ট করা

ওভারভিউ

এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে WifiManager ব্যবহার করে অ্যাপ থেকে Wi-Fi অন/অফ করা যায় এবং নেটওয়ার্ক লিস্ট থেকে কানেক্ট করা যায়।

⚠️ গুরুত্বপূর্ণ সীমাবদ্ধতা (Android 10+ / API 29+)

Android 10 (Q) থেকে থার্ড-পার্টি অ্যাপে WifiManager.setWifiEnabled() এবং addNetwork()/enableNetwork() ডিপ্রিকেটেড/ব্লক করা হয়েছে। এখন শুধু সিস্টেম অ্যাপ বা ডিভাইস ওনার অ্যাপগুলোই Wi-Fi ডাইরেক্ট কন্ট্রোল করতে পারে। সাধারণ অ্যাপগুলোকে WifiNetworkSpecifier বা WifiNetworkSuggestion API ব্যবহার করতে হয়।

প্রয়োজনীয় ধাপসমূহ (লিগ্যাসি/पुरানো API - API 28 এবং নিচে)

ধাপ ১: নতুন প্রজেক্ট তৈরি

ধাপ ২: 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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:background="#008080"
        android:padding="5dp"
        android:text="WiFi Control Demo"
        android:textColor="#fff"
        android:textSize="24sp"
        android:textStyle="bold" />
    
    <Switch
        android:id="@+id/switchWifi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
    
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/switchWifi"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp"
        android:text="WiFi OFF"
        android:textColor="@android:color/background_dark"
        android:textSize="24sp"
        android:textStyle="bold|italic" />
</RelativeLayout>

ধাপ ৩: MainActivity.kt (লিগ্যাসি API)

import android.content.Context
import android.net.wifi.WifiManager
import android.os.Build
import android.os.Bundle
import android.widget.CompoundButton
import android.widget.Switch
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {
    private lateinit var wifiSwitch: Switch
    private lateinit var statusText: TextView
    private lateinit var wifiManager: WifiManager
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "WiFi Control Demo"
        
        statusText = findViewById(R.id.textView)
        wifiSwitch = findViewById(R.id.switchWifi)
        wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        
        // সвичের প্রাথমিক স্টেট সেট
        wifiSwitch.isChecked = wifiManager.isWifiEnabled
        updateStatusText()
        
        wifiSwitch.setOnCheckedChangeListener { _, isChecked ->
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // Android 10+ এ ডায়রেক্ট কন্ট্রোল ব্লকড
                Toast.makeText(this, "Android 10+ এ অ্যাপ থেকে Wi-Fi অন/অফ করা যাবে না", Toast.LENGTH_LONG).show()
                wifiSwitch.isChecked = !isChecked // রিভার্ট
                return@setOnCheckedChangeListener
            }
            
            if (isChecked) {
                enableWiFi()
            } else {
                disableWiFi()
            }
            updateStatusText()
        }
    }
    
    private fun enableWiFi() {
        if (!wifiManager.isWifiEnabled) {
            wifiManager.isWifiEnabled = true
            Toast.makeText(this, "WiFi Enabling...", Toast.LENGTH_SHORT).show()
        }
    }
    
    private fun disableWiFi() {
        if (wifiManager.isWifiEnabled) {
            wifiManager.isWifiEnabled = false
            Toast.makeText(this, "WiFi Disabled", Toast.LENGTH_SHORT).show()
        }
    }
    
    private fun updateStatusText() {
        statusText.text = if (wifiManager.isWifiEnabled) "WiFi ON" else "WiFi OFF"
    }
}

ধাপ ৪: AndroidManifest.xml (পারমিশন)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.wificontrol">
    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- Android 12+ এর জন্য -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- স্ক্যানের জন্য -->
    
    <application ...>
        <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>

🚀 আধুনিক পদ্ধতি (Android 10+ / API 29+)

WifiNetworkSuggestion API (সুপারিশ করা)

ব্যবহারকারীকে প্রম্পট দিয়ে নেটওয়ার্ক সাজেস্ট করা যায়:

import android.net.wifi.WifiNetworkSuggestion
import android.net.wifi.WifiManager
import android.content.Context

val suggestion1 = WifiNetworkSuggestion.Builder()
    .setSsid("MyHomeWiFi")
    .setWpa2Passphrase("password123")
    .setIsAppInteractionRequired(true) // ব্যবহারকারী অথেনটিকেশন চাইলে
    .build()

val suggestion2 = WifiNetworkSuggestion.Builder()
    .setSsid("OfficeWiFi")
    .setWpa3Passphrase("securepass")
    .build()

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
val status = wifiManager.addNetworkSuggestions(listOf(suggestion1, suggestion2))

if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // সাজেশন সফল, ব্যবহারকারীকে প্রম্পট যাবে
}

WifiNetworkSpecifier API (নির্দিষ্ট নেটওয়ার্কে কানেক্ট)

import android.net.NetworkRequest
import android.net.wifi.WifiNetworkSpecifier
import android.content.Context
import android.net.ConnectivityManager

val specifier = WifiNetworkSpecifier.Builder()
    .setSsid("SpecificNetwork")
    .setWpa2Passphrase("password")
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // কানেক্টেড! এই নেটওয়ার্ক ব্যবহার করুন
        connectivityManager.bindProcessToNetwork(network)
    }
}
connectivityManager.requestNetwork(request, networkCallback)

Wi-Fi স্ক্যানিং (সব ভার্সনে কাজ করে)

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

// স্ক্যান শুরু
wifiManager.startScan()

// রেজাল্ট পাওয়ার BroadcastReceiver দিয়ে
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val results = wifiManager.scanResults
        results.forEach { scanResult ->
            Log.d("WiFiScan", "SSID: ${scanResult.SSID}, BSSID: ${scanResult.BSSID}, Level: ${scanResult.level} dBm")
        }
    }
}

registerReceiver(receiver, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
// অনরেজিস্টার ভুলবেন না onDestroy-এ
            
  1. অ্যান্ড্রয়েডে প্রোগ্রাম্যাটিক্যালি WiFi সংযোগ করার পদ্ধতি

  2. Kotlin ব্যবহার করে Android-এ রানটাইমে TextView স্টাইল পরিবর্তন করা

  3. অ্যান্ড্রয়েডে হিডেন ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করার পদ্ধতি

  4. অ্যান্ড্রয়েডে WPS দিয়ে WiFi কানেক্ট করার কুইক গাইড