蓝牙的使用(一)
蓝牙的打开及绑定蓝牙
- 判断是否支持蓝牙
- 判断蓝牙状态——打开或者关闭
- 将蓝牙打开或者关闭
- 将蓝牙进行暴露
- 查看附近的蓝牙设备
- 蓝牙的绑定
- 查看已绑定的蓝牙
具体的界面就是如下这么简单~(超级low)
其实在那些按钮的上面还有ListView 只是当前没有数据所以啥都不显示
在下面我们将会对以下的功能进行代码的分析虽然看着功能有点多但是实现一些功能有时候仅需要一个简单的方法,一两行代码就可以搞定
在蓝牙中BluetoothAdapter是一个非常重要的类,有下面几个作用
1、开关蓝牙设备
2、扫描蓝牙设备
3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;
判断是否支持蓝牙
首先创建出一个类BlueToothController,这个类用于对封装一些对蓝牙具体操作的方法,在MainActivity中写几个按钮用来操作
1.实例化BluetoothAdapter对象
bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
//如果支持蓝牙这个对象就可以被实例化出来
if (bluetoothAdapter!=null){
return true;
}else{
return false;
}
判断蓝牙状态
//判断当前蓝牙状态 true 打开 false 关闭
public boolean getBlueToothStatus(){
//添加一个断点
assert (bluetoothAdapter!=null);
//判断是否存在
return bluetoothAdapter.isEnabled();
}
打开蓝牙
通过打开新的界面来打开蓝牙
public void turnOnBlueTooth(Activity activity, int requestCode) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(intent, requestCode);
// mAdapter.enable(); //也可以通过这个方法打开蓝牙 但是谷歌官方不推荐
}
因为我们是通过新的界面打开的蓝牙 所以我们最好需要判断一下有没有打开这个新的界面 ,我们需要在Activity的代码中增加一个回调
//判断蓝牙是否请求成功
//收听Intent传回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
Toast.makeText(this, "打开成功", Toast.LENGTH_LONG).show();
Log.e("TAG", requestCode + "");
} else {
Toast.makeText(this, "打开失败", Toast.LENGTH_LONG).show();
Log.e("TAG2", requestCode + "");
}
}
关闭蓝牙
public void turnOffBlueTooth(){
//关闭蓝牙
bluetoothAdapter.disable();
}
既然都开关蓝牙了我们是不是应该有一个广播实时的监听蓝牙状态
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
switch (state) {
case BluetoothAdapter.STATE_ON:
Toast.makeText(context, "蓝牙是打开状态", Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_OFF:
Toast.makeText(context, "蓝牙是关闭状态", Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_TURNING_ON:
Toast.makeText(context, "蓝牙正在打开", Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Toast.makeText(context, "蓝牙正在关闭", Toast.LENGTH_SHORT).show();
break;
}
}
让蓝牙暴露(可以进行绑定)
//让蓝牙可见
public void enableVisibly(Context context){
//将蓝牙暴露出来
Intent discoverableIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//让蓝牙暴露5分钟300是300秒
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
context.startActivity(discoverableIntent);
}
查找蓝牙设备
1.查找设备
public void findDevice(){
if(bluetoothAdapter!=null){
bluetoothAdapter.startDiscovery();
}
}
2.将查找的设备绑定在ListView上面
此处省略ListView和适配器的创建
查找到的蓝牙信息显示在ListView上面
//获取对应的蓝牙设备,将List中的每个item赋值给device
BluetoothDevice device= (BluetoothDevice) getItem(position);
holder.text_view1.setText(device.getName());//得到蓝牙设备的名称
holder.text_view2.setText(device.getAddress());//获得蓝牙地址
在适配器中还有一个刷新数据的方法
//刷新数据
public void refresh(List<BluetoothDevice> data) {
mList = data;
notifyDataSetChanged();
}
BluetoothDevice 是一个蓝牙资源的类 可以获取信息或者链接蓝牙设备
那我们怎样找到附近的蓝牙呢 这就需要广播来传递信息
在这里我将通过广播监听蓝牙的各种状态进行不同的操作
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//蓝牙扫描过程开始
if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
Log.e("TAG", "蓝牙开始扫描");
//初始化数据列表
mDeviceList.clear();
adapter.notifyDataSetChanged();
//扫描过程结束
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
Log.e("TAG", "扫描过程结束");
//搜索到任意一个蓝牙设备
} else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//找到一个,添加一个
mDeviceList.add(device);
adapter.notifyDataSetChanged();
//蓝牙扫描状态发生改变
} else if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) {
//EXTRA_SCAN_MODE扫描模式的一种
int scanMode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, 0);
//可见状态
if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
} else {
}
//当前设备链接状态改变判断有没有连接上
} else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (remoteDevice == null) {
Toast.makeText(context, "没有资源", Toast.LENGTH_SHORT).show();
return;
}
int status = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, 0);
//如果当时状态是已连接
if (status == BluetoothDevice.BOND_BONDED) {
Toast.makeText(context, "Bonded " + remoteDevice.getName(), Toast.LENGTH_SHORT).show();
//状态是正在连接
} else if (status == BluetoothDevice.BOND_BONDING) {
Toast.makeText(context, "Bonding " + remoteDevice.getName(), Toast.LENGTH_SHORT).show();
//状态是还未链接
} else if (status == BluetoothDevice.BOND_NONE) {
Toast.makeText(context, "Not bond " + remoteDevice.getName(), Toast.LENGTH_SHORT).show();
}
}
}
还有许多的广播在下面我会将别的大牛网址po上去,上面有各种广播的介绍还有蓝牙的具体介绍
如上可以看出找到蓝牙并存到List集合中主要用了
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//找到一个,添加一个
mDeviceList.add(device);
adapter.notifyDataSetChanged();
这样的代码和 BluetoothDevice.ACTION_FOUND 的广播监听
在控制台打印
广播进行注册(这里有两个广播)
//本机蓝牙广播的注册
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(new BlueToothReceiver(), filter);
//蓝牙搜索绑定的广播注册
IntentFilter foundFilter = new IntentFilter();
//开始查找
foundFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
//结束查找
foundFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
//查找设备
foundFilter.addAction(BluetoothDevice.ACTION_FOUND);
//设备扫描模式改变
foundFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
//绑定状态
foundFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(new ActionFound(), foundFilter);
接下来我们通过点击所搜索到的蓝牙进行绑定
这里用到了ListView条目的点击事件
private AdapterView.OnItemClickListener bindDeviceClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
BluetoothDevice device = mDeviceList.get(i);
device.createBond();//绑定
}
};
listView.setOnItemClickListener(bindDeviceClick);
通过这样略有些复杂的过程就可以查找到蓝牙并进行绑定了
查看已绑定的蓝牙
//获取可绑定设备
public List<BluetoothDevice> getBondedDeviceList() {
return new ArrayList<>(bluetoothAdapter.getBondedDevices());//得到一个蓝牙元素(是0位置的蓝牙元素)
}
中国这个方法我们可以直接得到一个List数组
这样我们蓝牙的打开与绑定就算是写完了,我只是对我自定义的蓝牙操作类进行解释,具体的方法实现还要在Activity中按钮的点击事件来写
给大家推荐一篇大牛的博客,他实现的功能比我要全,讲解也十分的详细
http://blog.csdn.net/qinjuning/article/details/7726093