Tạo app Wifi Scanner cho Android nhanh, gọn nhất

0
623

Trong một lần khám phá bộ Android SDK, mình mới thấy Google họ cung cấp rất nhiều tính năng hay mà anh em không biết. Chắc hẳn bạn dùng điện thoại thì không còn lạ gì tính năng kết nối Wifi rồi đúng không? Bạn có muốn xây dựng một app wifi scanner giống như vậy không?

Hôm nay, mình sẽ hướng dẫn các bạn tự xây dựng một app Wifi scanner, có khả năng quét tìm các Wifi xung quanh bạn. Ứng dụng này sẽ cực đơn giản, mục đích để các bạn học hỏi thôi.

Chúng ta bắt đầu nhé!

tao-app-wifi-scanner-cho-android

 

App WIFI Scanner trong Android

Để ứng dụng có thể scan được WIFI thì bạn cần permission: android.permission.ACCESS_WIFI_STATE . Permission cho phép chúng ta có quyền truy cập vào thông tin của mạng WIFI.

Từ Android M trở lên thì permission này cần phải được sự đồng ý của người dùng trước khi có thể dùng được( runtime permission request).

Tuy nhiên, bài viết này mình sẽ không tập trung vào hướng dẫn cách request permission. Các bạn có thể tham khảo thêm ở bài viết: Runtime permission trong Android

#1. Bước đầu xây dựng app Wifi Scanner: Thêm permission vào manifest

Để ứng dụng có thể sử dụng các permission cần thiết, bạn chỉ cần khai báo trong manifest.

Trong trường hợp ứng dụng wifi scanner, chúng ta thêm ACCESS_WIFI_STATE vào trong manifest như sau:

<?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>

#2. Xây dựng giao diện app wifi scanner

Bước tiếp theo là xây dựng giao diện ứng dụng. Ở bài viết này, chúng ta sẽ tạo ứng dụng với giao diện không thể đơn giản hơn với 1 Button và 1 ListView.

Bạn có lẽ cũng đoán được tác dụng của hai view trên rồi đúng không?

Đúng vậy, Button là để người dùng có thể bắt đầu quá trình scan các mạng wifi xung quan. Khi quét xong thì danh sách Wifi phát hiện được sẽ hiển thị lên ListView.

Đây là code của phần layout:

<?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>

#3. Viết code để scan WIFI

Như vậy là đã chuẩn bị xong các thủ tục cần thiết( khai báo permission và thiết kế layout). Bây giờ là lúc chúng ta sẽ viết code để thực hiện logic của chương trình.

Trong Android SDK, Wifi Api được truy cập thông qua System service là WifiManager.

Trước khi chúng ta có thể gọi WifiManager, chúng ta cần phải kiểm tra xem điện thoại đã bật WIFI chưa. Nếu điện thoại tắt WIFI thì cần phải bật nó bằng cách gọi hàm setWifiEnabled()

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 scan các mạng WIFI khả dụng xung quan bằng cách sử dụng BroadcastReceiver.

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();
}

Nếu bạn chưa biết BroadCast Receiver là gì? Bạn có thể đọc thêm về BroadCast tại đây: Tất tần tật về Broadcast Receiver trong Android

Khi quá trình scan kết thúc, hàm onReceive() sẽ được gọi. Để lấy kết quả là danh sách các mạng wifi thì bạn cần gọi hàm getScanResults().

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();
    }
  };
}
Lưu ý: Đừng quên hủy đăng ký BroadcastReceiver để tránh ứng dụng ngốn pin của điện thoại nhé

Đây là toàn bộ code củaMainActivity.

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();
      }
    };
  }
}

#4. Demo ứng dụng

Cơ bản là chúng ta đã hoàn thành các bước để có thể scan được các mạng wifi xung quanh. Đây là kết quả:

tao-app-wifi-scanner-cho-android

Cũng không tồi phải không?

Còn đây là phiên bản hướng dẫn bằng video. Các bạn tham khảo nhé.

Trên đây là tất cả hướng dẫn của mình về app wifi scanner. Nếu bạn có bất kỳ câu hỏi nào thì để lại comment bên dưới.

Đừng quên like và chia sẻ bài viết cho bạn bè cùng đọc nhé.

Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Thông báo