我是先学习一个蓝牙聊天程序后自己打的上面代码。下面分析两个下载链接:第一个是本次实例的代码,
第二个是那个蓝牙聊天项目的视频教程和对应源代码
(建议先看视频,视频很详细的介绍了蓝牙的使用代码,保证看完后,对蓝牙的使用就too easy)
一.所有关于 Bluetooth的API都在android.bluetooth包下:
BluetoothAdapter(可理解为本地蓝牙设备)
这个类代表蓝牙适配器,并且是所有蓝牙交互的入口点,通过这个类,我们可以发现其他的蓝牙设备,查询已经配对的设备;
实例化一个BluetoothDevice,BluetoothDevice使用一个已知的MAC地址,并创建一个BluetoothServerSocket监听来自其他设备的通讯。
BluetoothDevice(可理解为远程蓝牙设备)
代表一个蓝牙设备,通它可以通过BluetoothSocket向其他的蓝牙设备发出连接请求;
通过它还可以设备的信息包括:设备名称、设备地址、类型、配对状态。
BluetoothSocket(连接远程设备时用到)
代表一个蓝牙套接字接口(类似于一个TCP套接字);
它是一个连接点,允许应用程序与另一个蓝牙设备交换数据通过InputStream OutputStream。
BluetoothServerSocket(远程设备请求连接时用到)
是一个开放的服务器套接字,侦听传入请求(类似于一个TCP ServerSocket);
为了连接两个Android设备,设备必须用这个类打开一个服务器套接字;
当一个远程蓝牙设备请求连接到这个设备,如果请求的连接被接受,那么BluetoothServerSocket将返回一个已经连接的BluetoothSocket对象。
广播
BluetoothDevice.ACTION_FOUND //查找设备
BluetoothAdapter.ACTION_DISCOVERY_FINISHED //查找完成
BluetoothDevice.ACTION_ACL_CONNECTED //连接设备
BluetoothDevice.ACTION_ACL_DISCONNECTED //断开连接
二.代码
本次代码只到连接到蓝牙设备,关于IO通信的还待扩展。这里只讲大概流程,具体细节代码在下面会分享一个链接。
第一步:打开蓝牙设备,并先存入设备和显示已配对设备名称
private void openAndFindBTDevice() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Log.e(TAG, "Your device is not support Bluetooth!");
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_CODE);
} else {
findBTDevice();
}
}
private void findBTDevice() {
// 用来保存已经配对的蓝牙设备对象
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
// 将已经配对设备信息添加到ListView中
mArrayAdapter.add(device.getName());
mDeviceList.add(device);
}
}
adapter.notifyDataSetChanged();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_CODE) {
if (resultCode == RESULT_OK) {
System.out.println("设备打开成功");
findBTDevice();
} else {
System.out.println("设备打开失败");
}
}
}
第二步:按下按钮搜索蓝牙设备
@Override
public void onClick(View v) {
if (!mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.startDiscovery();
setProgressBarIndeterminateVisibility(true);
}
}
//广播接收器接收设备并保存刷新
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// 扫描到新的蓝牙设备
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// 获得蓝牙设备对象
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//防止设备对象添加重复
if (mDeviceList.contains(device)) {
return;
}
mArrayAdapter.add(device.getName());
System.out.println(device.getName());
mDeviceList.add(device);
adapter.notifyDataSetChanged();
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
// 扫描完成,关闭显示进度条
setProgressBarIndeterminateVisibility(false);
}
if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(getApplicationContext(), "蓝牙已连接", Toast.LENGTH_SHORT).show();
} else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(getApplicationContext(), "蓝牙连接断开", Toast.LENGTH_SHORT).show();
String name = mDeviceList.get(devicePosition).getName() ;
mArrayAdapter.remove(devicePosition);
mArrayAdapter.add(devicePosition, name);
adapter.notifyDataSetChanged();
}
}
};
第三步:选项监听,点击蓝牙设备则进行连接
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
connected(mDeviceList.get(position), position);
}
// UUID号,表示不同的数据协议
private final String UUID_STR = "00001101-0000-1000-8000-00805F9B34FB";
//连接指定蓝牙设备
private void connected(BluetoothDevice device, int position) {
BluetoothSocket mSocket;
BluetoothDevice mDevice;
BluetoothSocket tmp = null;
mDevice = device;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID
.fromString(UUID_STR));
// Toast.makeText(getApplicationContext(), "开始连接", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "蓝牙连接失败", Toast.LENGTH_SHORT).show();
}
mSocket = tmp;
// 取消设备扫描
mBluetoothAdapter.cancelDiscovery();
try {
// 连接远程服务器设备
mSocket.connect();
//修改设备显示名字
String name = mDeviceList.get(position).getName() + "\t 已连接";
devicePosition = position;
mArrayAdapter.remove(position);
mArrayAdapter.add(position, name);
adapter.notifyDataSetChanged();
// Toast.makeText(MainActivity.this, "蓝牙连接成功", Toast.LENGTH_SHORT).show();
} catch (IOException connectException) {
Toast.makeText(MainActivity.this, "蓝牙连接失败", Toast.LENGTH_SHORT).show();
try {
mSocket.close();
} catch (IOException closeException) {
}
}
}
下面那张图片是最终连接上的显示效果。
我是先学习一个蓝牙聊天程序后自己打的上面代码。下面分析两个下载链接:第一个是本次实例的代码,
第二个是那个蓝牙聊天项目的视频教程和对应源代码(建议先看视频,视频很详细的介绍了蓝牙的使用代码,保证看完后,对蓝牙的使用就too easy)