Tạo ứng dụng quét wifi đơn giản cho điện thoại Android

API WiFi được cung cấp với SDK thực sự rất thú vị. Trong hướng dẫn này, chúng ta sẽ cùng tìm hiểu và phát triển một ứng dụng scan WiFi đơn giản với Android Studio nhé!

Bạn hãy lưu ý rằng mình sẽ không đi sâu vào quản lý các permission trong bài hướng dẫn này vì mình chỉ tập trung vào API WiFi. Bạn có thể tham khảo video ở link này để hiểu cách quản lý Permission: https://youtu.be/wy2EMWDpIGE

Bước 1: Thêm Permisson

Bước đầu tiên là thêm các Permission chính xác trong file Android Manifest của ứng dụng. Chúng ta sẽ cần thêm permission ACCESS_WIFI_STATE. Nó sẽ cho phép ứng dụng của bạn truy cập thông tin về mạng WiFi.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ssaurel.scanwifi">

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <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=".WiFiScannerActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Bước 2: Tạo giao diện chính cho ứng dụng

Bước tiếp theo là tạo giao diện cho ứng dụng quét WiFi của chúng ta. Nó sẽ được thiết kế đơn giản với một ListView và 1 Button. Trong đó, ListView sẽ hiển thị các mạng WiFi được phát hiện bởi thiết bị của chúng ta. Khi click Button, ứng dụng sẽ cho phép người dùng bắt đầu quá trình quét WiFi.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/wifiList"
        android:layout_width="match_parent"
        android:layout_height="312dp"
        android:layout_weight="0.97"/>

    <Button
        android:id="@+id/scanBtn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:layout_margin="15dp"
        android:background="@android:color/holo_red_light"
        android:text="Scan WiFi"/>

</LinearLayout>

Bước 3: Viết code cho MainActivity

Bây giờ, chúng ta sẽ viết code cho MainActivity. Trên SDK Android, API WiFi được truy cập thông qua System Service có tên là WifiManager. Chúng ta cần kiểm tra xem WiFi đã được bật trên thiết bị chưa. Nếu chưa, chúng ta cần kích hoạt nó bằng cách gọi phương thức setWifiEnables với tham số truyền vào là true:

if (!wifiManager.isWifiEnabled()) {
  Toast.makeText(this, "WiFi is disabled ... We need to enable it", Toast.LENGTH_LONG).show();
  wifiManager.setWifiEnabled(true);
}

Sau đó, chúng ta có thể bắt đầu quét các mạng WiFi xung quanh chúng ta. Chúng ta cần sử dụng một BroadcastReceiver chuyên dụng: WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

Khi đăng ký thành công BroadcastReceiver, chúng ta có thể bắt đầu quét các mạng WiFi bằng cách gọi phương thức startScan của WifiManager Service:

private void scanWifi() {
  arrayList.clear();
  registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
  wifiManager.startScan();
  Toast.makeText(this, "Scanning WiFi ...", Toast.LENGTH_SHORT).show();
}

Khi quá trình quét kết thúc, trong hàm onReceive của BroadcastReceiver, chúng ta cần gọi phương thức getScanResults của WifiManager Service để lấy kết quả. Và đừng quên hủy đăng ký BroadcastReceiver để tiết kiệm Pin cho thiết bị.

BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    results = wifiManager.getScanResults();
    unregisterReceiver(this);

    for (ScanResult scanResult : results) {
      arrayList.add(scanResult.SSID + " - " + scanResult.capabilities);
      adapter.notifyDataSetChanged();
    }
  };
}

MainActivity của chúng ta sẽ như thế này:

package com.ssaurel.scanwifi;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class WiFiScannerActivity extends AppCompatActivity{

  private WifiManager wifiManager;
  private ListView listView;
  private Button buttonScan;
  private int size = 0;
  private List<ScanResult> results;
  private ArrayList<String> arrayList = new ArrayList<>();
  private ArrayAdapter adapter;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    buttonScan = findViewById(R.id.scanBtn);
    buttonScan.setOnClickListener(new View.OnClickListener() {
	  @Override
      public void onClick(View view) {
        scanWifi();
      }
    });

    listView = findViewById(R.id.wifiList);
    wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

    if (!wifiManager.isWifiEnabled()) {
      Toast.makeText(this, "WiFi is disabled ... We need to enable it", Toast.LENGTH_LONG).show();
      wifiManager.setWifiEnabled(true);
    }

    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
    listView.setAdapter(adapter);
    scanWifi();
  }

  private void scanWifi() {
    arrayList.clear();
    registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    wifiManager.startScan();
    Toast.makeText(this, "Scanning WiFi ...", Toast.LENGTH_SHORT).show();
  }

  BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      results = wifiManager.getScanResults();
      unregisterReceiver(this);

      for (ScanResult scanResult : results) {
        arrayList.add(scanResult.SSID + " - " + scanResult.capabilities);
        adapter.notifyDataSetChanged();
      }
    };
  }
}

Run app

Click button scan và xem kết quả nhé!