Bluetooth
Bài đăng này đã không được cập nhật trong 7 năm
1. Cài đặt
- Tạo 1 project và đặt tên là AndroidConnection
- acitivity_main.xml định nghĩa như dưới đây:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.maidaidien.androidconnection.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/bluetooth"
android:id="@+id/btnBluetooth"
android:onClick="getBluetoothActivity"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
- Với Bluetooth api các thiết bị android có thể trao đổi dữ liệu với nhau thông qua các bước sau: + Scan để tìm các thiết bị khác đang bật bluetooth + Query để kết nối hai thiết bị + Thiết lập kết nối hai thiết bị bluetooth + Trao đổi dữ liệu
2. Tạo màn hình xử lí bluetooth
- Tạo Activity BluetoothActivity.java với layout là RelativeLayout chứa ToggleButton và ListView
- Layout activity_bluetooth.xml như bên dưới
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.maidaidien.androidconnection.BluetoothActivity">
<ToggleButton
android:id="@+id/toggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:onClick="onToggleClicked"
android:textOff="Bluetooth Off"
android:textOn="Bluetooth On"/>
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/toggleButton"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
3. Kiểm tra Bluetooth có được hỗ trợ trong thiết bị hay không
- Trước khi sử dụng các chức năng của bluetooth ta cần kiểm tra xem thiết bị có hỗ trợ bluetooth không
- Để kiểm tra xem thiết bị có hỗ trợ Bluetooth hay không ta dùng BluetoothAdapter
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// Thiết bị không hỗ trợ Bluetooth
} else {
// Thiết bị có hỗ trợ Bluetooth
}
4. Bật Bluetooth
- Khi thiết bị có hỗ trợ bluetooth ta cần đảm bảo bluetooth đang được bật. Để kiểm tra bluetooth có đang được bật hay không ta sử dụng phương thức "isEnable()" của lớp BluetoothAdapter. Nếu phương thức này trả về false ta cần bật bluetooth sử dụng request sau: gọi phương thức startActivityForResult() với intent ACTION_REQUEST_ENABLE
if (!bluetoothAdapter.isEnabled()) {
Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, ENABLE_BT_REQUEST_CODE);
}
Lưu ý: ENABLE_BT_REQUEST_CODE được định nghĩa local trong activity và phải lớn hơn 0 để kết qủa sẽ được hệ thống trả về trong phương thức onActivityResult()
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ENABLE_BT_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(getApplicationContext(), "Ha! Bluetooth has been enabled.",
Toast.LENGTH_SHORT).show();
} else { // RESULT_CANCELED as user refuse or failed
Toast.makeText(getApplicationContext(), "Bluetooth is not enabled.",
Toast.LENGTH_SHORT).show();
}
}
}
5. public thiết bị với các thiết bị bluetooth khác (các thiết bị khác có thể scan thấy device của mình)
- Cũng tương tự như enable ta sẽ gọi phương thức startActivityForResult() với intent ACTION_REQUEST_DISCOVERABLE
protected void makeDiscoverable(){
// Make local device discoverable
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_DURATION);
startActivityForResult(discoverableIntent, DISCOVERABLE_BT_REQUEST_CODE);
}
- DISCOVERABLE_BT_REQUEST_CODE được định nghĩa local tương tự ENABLE_BT_REQUEST_CODE. Thông thường thời gian discoverable là 120s, ta có thể thay đổi như sau discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVERABLE_DURATION);, DISCOVERABLE_DURATION là gía trị integer mà ta muốn.
- kết qủa sẽ được trả về phương thức onActivityResult()
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ENABLE_BT_REQUEST_CODE) {
// other code
} else if (requestCode == DISCOVERABLE_BT_REQUEST_CODE){
if (resultCode == DISCOVERABLE_DURATION){
Toast.makeText(getApplicationContext(), "Your device is now discoverable by other devices for " +
DISCOVERABLE_DURATION + " seconds",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Fail to enable discoverability on your device.",
Toast.LENGTH_SHORT).show();
}
}
}
Lưu ý: Bật khả năng phát hiện thiết bị sẽ tự động kích hoạt Bluetooth nếu nó chưa được bật trên thiết bị. 6. Discovery bluetooth
- Gọi phương thức startDiscovery() của lớp BluetoothAdapter
protected void discoverDevices(){
// To scan for remote Bluetooth devices
if (bluetoothAdapter.startDiscovery()) {
Toast.makeText(getApplicationContext(), "Discovering other bluetooth devices...",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "Discovery failed to start.",
Toast.LENGTH_SHORT).show();
}
}
phương thức sẽ thực hiện discovery các thiết bị bluetooth khác và sẽ trả về gía trị boolean.
-
Với mỗi thiết bị được discovery hệ thống sẽ thông báo với action ACTION_FOUND, intent này luôn gồm 2 dữ liệu + EXTRA_DEVICE: chứa BluetoothDevice là thiết bị remote + EXTRA_CLASS: chứa BluetoothClass miêu tả về đặc điểm của thiết bị đã found
-
Để bắt được thông báo trên ta làm như sau:
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Whenever a remote Bluetooth device is found
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
adapter.add(device.getName() + "\n" + device.getAddress());
}
}
};
với intentfilter như sau:
// Register the BroadcastReceiver for ACTION_FOUND
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(broadcastReceiver, filter);
7. Tắt Bluetooth
bluetoothAdapter.disable();
8. Kết nối thiết bị Cài đặt Listening server
- Phần server sẽ sử dụng "BluetoothServerSocket" để lắng nghe request kết nối đến. Khi có kết nối đến và được accept thì server socket sẽ trả về "BluetoothSocket"" để quản lí kết nối
- gọi phương thức "listenUsingRfcommWithServiceRecord()" của lớp BluetoothAdapter
BluetoothServerSocket bluetoothServerSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(getString(R.string.app_name), uuid);
tham số thứ 2 uuid được sử dụng để định danh cho bluetooth của app
private final static UUID uuid = UUID.fromString("fc5ffc49-00e3-4c8b-9cf1-6b72aad1001a");
- gọi phương thức "accept()" để bắt đầu lắng nghe request kết nối
Cài đặt kết nối client
- Sử dụng object "BluetoothDevice" để đại diện cho thiết bị bluetooth ta muốn kết nối đến. App sẽ gọi phương thức "createRfcommSocketToServiceRecord(UUID)" để tạo "BluetoothSocket"
BluetoothSocket bluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
- gọi phương thức "connect()" của "BluetoothSocket" để yêu câu kết nối
bluetoothSocket.connect();
Lưu ý: cần sử dụng permission trong manifest
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
source code source: Peter Leow article
All rights reserved