Bluetooth 디바이스 연결

Bluetooth 지원기기 체크

bluetoothAdapter가 null 이면 기기가 블루투스를 지원하지 않는 것이다.

1
2
3
4
if (bluetoothAdapter == null) {
Toast.makeText(MainActivity.this, "이 기기는 블루투스를 지원하지 않습니다.", Toast.LENGTH_SHORT).show();
return false;
}

페어링 된 디바이스 목록 가져오기

getBondedDevices()를 통해서 페어링된 기기 목록을 가져올 수 있다.
목록의 이름을 deviceArray에 저장해서 UI에서 목록을 보여줄 때 사용한다.

1
2
3
4
5
6
7
8
9
10
final Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
if (devices.size() > 0) {
final String[] deviceArray = new String[devices.size()];
Iterator<BluetoothDevice> iter = devices.iterator();
int i = 0;
while (iter.hasNext()) {
BluetoothDevice d = iter.next();
deviceArray[i] = d.getName();
i++;
}

AlertDialog에서 페어링된 디바이스 목록 보여주기.

AlertDialog.Builder를 통해 AlertDialog를 생성한다.

setTitle를 통해 Title을 설정한다.

setItems에서 위에서 페어링된 디바이스 이름 목록을 설정하고 클릭시를 정의한다.

디바이스 목록을 클릭시 showProgressDialgo함수를 통해 ProgressDialgo를 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
private void showProgressDialgo(String name) {
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Waiting");
progressDialog.setMessage(name + "에 연결을 시도합니다.");
progressDialog.setButton("취소", new ProgressDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
progressDialog.show();
}

그 후 clientThread를 생성하고 bluetooth 연결을 시도한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("device 선택");
builder.setItems(deviceArray, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selectDeivceStr = deviceArray[which];
for (BluetoothDevice device : devices) {
if (device.getName().equals(selectDeivceStr)) {
MainActivity.this.device = device;
showProgressDialgo(device.getName());
if(socket != null){
try {
if (writeThread != null) {
writeHandler.getLooper().quit();
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

}

ClientThread clientThread = new ClientThread();
clientThread.start();
}
}
}
});
AlertDialog dialog = builder.create();
dialog.show();

ClinetThread

createRfcommSocketToServiceRecord(MY_UUID)로 소켓을 취득 후

socket.connect()를 통해 블루투스 통신을 연결한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class ClientThread extends Thread {
@Override
public void run() {
try {
bluetoothAdapter.cancelDiscovery();
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();

if (readThread != null) {
readFlag = false;
}
readThread = new ReadThread(socket);
readThread.start();
if (writeThread != null) {
writeHandler.getLooper().quit();
}
writeThread = new WriteThread(socket);
writeThread.start();

socketIsConnected = new SocketIsConnected(socket);
socketIsConnected.start();

isConnected = true;
//최초에 연결 되었다는 신호 보낸다.
isConnectMessage = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}

ActionBar의 버튼을 눌렀을때 동작 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_lab3_bluetooth) {
if (bluetoothAdapter == null) {
Toast.makeText(MainActivity.this, "이 기기는 블루투스를 지원하지 않습니다.", Toast.LENGTH_SHORT).show();
return false;
}
final Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
if (devices.size() > 0) {
final String[] deviceArray = new String[devices.size()];
Iterator<BluetoothDevice> iter = devices.iterator();
int i = 0;
while (iter.hasNext()) {
BluetoothDevice d = iter.next();
deviceArray[i] = d.getName();
i++;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("device 선택");
builder.setItems(deviceArray, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selectDeivceStr = deviceArray[which];
for (BluetoothDevice device : devices) {
if (device.getName().equals(selectDeivceStr)) {
MainActivity.this.device = device;
showProgressDialgo(device.getName());
if(socket != null){
try {
if (writeThread != null) {
writeHandler.getLooper().quit();
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

}

ClientThread clientThread = new ClientThread();
clientThread.start();
}
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
return super.onOptionsItemSelected(item);
}
공유하기