ওভারভিউ
এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে WifiManager ব্যবহার করে অ্যাপ থেকে Wi-Fi অন/অফ করা যায় এবং নেটওয়ার্ক লিস্ট থেকে কানেক্ট করা যায়।
⚠️ গুরুত্বপূর্ণ সীমাবদ্ধতা (Android 10+ / API 29+)
Android 10 (Q) থেকে থার্ড-পার্টি অ্যাপে
WifiManager.setWifiEnabled()এবংaddNetwork()/enableNetwork()ডিপ্রিকেটেড/ব্লক করা হয়েছে। এখন শুধু সিস্টেম অ্যাপ বা ডিভাইস ওনার অ্যাপগুলোই Wi-Fi ডাইরেক্ট কন্ট্রোল করতে পারে। সাধারণ অ্যাপগুলোকেWifiNetworkSpecifierবাWifiNetworkSuggestionAPI ব্যবহার করতে হয়।
প্রয়োজনীয় ধাপসমূহ (লিগ্যাসি/पुरানো 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-এ