Wifi
Bài đăng này đã không được cập nhật trong 7 năm
Trên nền tảng Android có cung cấp API WifiManager quản lí việc kết nôi wifi trên thiết bị di động. Thông qua API này ứng dụng có thể:
- scan access points và lấy thông tin như BSSID, SSID, tần số, key management, scheme mã hóa
- kết nối hoặc ngắt kết nối wifi
- cấu hình network
WifiManager định nghĩa một số Intent action để thông báo những thay đổi trạng thái của Wi-Fi như "SCAN_RESULTS_AVAILABLE_ACTION" và "NETWORK_STATE_CHANGED_ACTION". The Wi-Fi Agenda Chúng ta sẽ tạo một activity thực hiện các chức năng liên quan đến wifi như sau:
- Enable/disable Wi-Fi
- Scan access points
- Hiển thị những thông tin của access points trong listview.
Trong project ta đã tạo ở bài trước Tạo một Activity và đặt tên là "WiFiActivity" với layout như sau
activity_wifi.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/toggleButton"
android:textOn="Wi-fi On"
android:textOff="Wi-fi Off"
android:onClick="onToggleClicked" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_centerHorizontal="true"
android:layout_below="@+id/toggleButton" />
</RelativeLayout>
Granting Wi-Fi Access
Trước khi có thể sử dụng Wifi trong ứng dụng, ta cần khai báo permission trong file manifest.
manifest.xml
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Verifying Wi-Fi Support Trước khi sử dụng các chức năng Wifi ta cần kiểm tra xem thiết bị có hỗ trợ wifi không. Để thực hiện điều đó ta sẽ dùng lớp "WifiManager".
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifiManager == null) {
// Device does not support Wi-Fi
} else {
// Any vaild Wi-Fi operations
}
Toggling Wi-Fi Ta có thể bật và tắt wifi bằng việc gọi phương thức "setWifiEnabled()" của lớp WifiManager. Ta sẽ truyền tham số boolean cho phương thức, "true" để bật hoặc "false" để tắt wifi
wifiManager.setWifiEnabled(true); // To turn on the Wi-Fi
Discovering Access Points Để scan access points ta gọi phương thức "startScan()" của lớp WifiManager
wifiManager.startScan();
Qúa trình scan được thực hiện bất đồng bộ và phương thức "startScan()" sẽ trả về biến boolean để xác định qúa trình start scan có thành công hay không. Để thông báo kết qủa scan được cho ui thì sẽ dùng BroadcastReceiver. Khi qúa trình scan hoàn tất, app sẽ thông báo qua BroadcastReceiver với Intent action là "SCAN_RESULTS_AVAILABLE_ACTION". Kết qủa của qúa trình scan có thể được lấy ra bằng phương thức "getScanResults()" của lớp WifiManager. Để bắt được thông báo trên, app cần phải đăng kí BroadcastReceiver với Intent action "SCAN_RESULTS_AVAILABLE_ACTION". Đầu tiên ta cần tạo lớp BroadcastReceiver như sau:
class WiFiScanReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
List<ScanResult> wifiScanResultList = wifiManager.getScanResults();
for(int i = 0; i < wifiScanResultList.size(); i++){
ScanResult accessPoint = wifiScanResultList.get(i);
String listItem = accessPoint.SSID+", "+accessPoint.BSSID;
adapter.add(listItem);
}
}
}
}
Sau đó đăng kí BroadcastReceiver trên như dưới đây:
IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiReciever, filter);
Testing Wi-Fi Thêm button trong activity_main.xml
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/wifi"
android:id="@+id/btnWifi"
android:onClick="getWifiActivity"
android:layout_below="@+id/btnBluetooth"
android:layout_centerHorizontal="true" /i
Trong MainActivity thêm phương thức sau:
public void getWifiActivity(View view) {
Intent intent = new Intent(getApplicationContext(), WiFiActivity.class);
startActivity(intent);
}
source code source: Peter Leow article
All rights reserved