Android蓝牙通讯(二)————蓝牙的相关操作
来源:互联网 发布:网络接入服务商怎么查 编辑:程序博客网 时间:2024/05/22 10:25
接着上一篇博客说,当我们把蓝牙的权限部分解决了之后,就可以使用蓝牙的相关的功能了!
基本功能包括:
- 打开蓝牙
- 设置蓝牙的可见性
- 开始搜索周边可见设备
- 尝试连接设备
- 取消搜索周边设备
关闭蓝牙
下面就上面的基本操作给出相关的介绍和代码:
打开蓝牙
打开蓝牙有两种方式,我们可以通过BluetoothAdapter直接使用enable方法,直接打开蓝牙设备,这种方法不会询问/通知用户蓝牙的状态被改变(不过我们国内的用户不用担心这些事情,国内的手机需要通过CTA测试,测试中要求蓝牙设备被打开时需要给用户提示!! 贴心)。
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) { // 判断手机中是否有蓝牙设备}mBluetoothAdapter.enable();//打开蓝牙
除了上述的方法之外,我们也可以通过使用Intent来打开蓝牙,这种方法需要用户的互动,只用用户点击确认时才会正常的打开蓝牙。
if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}
- 设置蓝牙可见性
在打开蓝牙时,蓝牙时默认不可见的,也就是说,其他的蓝牙不能搜索到本设备,需要通过设置蓝牙的可见性,让其他的设备可以搜索到本设备。设置可见性的方法如下:
Intent discoverableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverableIntent);
可见性的时间由EXTRA_DISCOVERABLE_DURATION设定,取值范围在0~3600秒之间,当设置为0的时候表示蓝牙设备永远可见,如果设置的时间不在0~3600之间,时间会被默认设置为300秒。如果在设置可见性,蓝牙设备没有打开,设备将会被自动打开!!!
- 开始搜索周边设备
在我们回去本地的BluetoothAdapter对象后,可以直接通过使用startDiscovery发现周围设备!
使用方法很简单,如下:
if(mBluetoothAdapter != null && mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON){ mBluetoothAdapter.startDiscovery();}
现在,我们可以搜索周围的设备了,现在问题来了,我们怎么获取已经搜索到的设备呢?答案是:广播,android在每检测到一件设备时,都会往上层放送一个广播,广播中会包含BluetoothDevice对象!
广播如下:
//定义广播BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())){ //更新相关提示UI } if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())){ //更新相关提示UI } if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())){ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); } } }; //注册广播 IntentFilter mFilter = new IntentFilter(); mFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); mFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); mFilter.addAction(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver,mFilter);
我们可以在广播的回调中不断的获取搜索到的设备!
- 取消搜索
使用cancelDiscovery方法取消当前的搜索!如下:
mBluetoothAdapter.cancelDiscovery();
- 尝试连接设备(作为客户端)
在连接设备时,需要使用BluetoothSocket和BluetoothDevice,作为客户端时,使用BluetoothDevice产生一个BluetoothSocket,如下所示:
BluetoothDevice mDevice = .....BLuetoothSocket mClientSocket;mClientSocket = mDevice.createInsecureRfcommSocketToServiceRecord(UUID_INSECURE);mClientSocket.connect();
UUID_INSECURE是“Universally Unique Identifier”的缩写,通用唯一识别码的意思。对于蓝牙设备,每个服务都有一个与它对应的UUID(唯一的)。
这里创建的socket是不安全的连接,这种连接是不需要配对校验的,当然也可以创建安全的连接(createRfcommSocketToServiceRecord(UUID_INSECURE))。
当然了,如果想要连接成功,服务端那边需要监听连接,否则无法连接成功的!!
- 尝试连接设备(作为服务器端)
需要使用BluetoothAdapter和BluetoothServerSocket,使用BluetoothAdapter产生一个BluetoothServerSocket对象,通过这个对象监听这个socket端口。
如下:
private BluetoothServerSocket mServerSocket;private BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();mServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord("bluetooth",UUID_INSECURE);
需要指出的是,BluetoothServerSocket和BluetoothSocket的创建需要使用相同的UUID。socket的类型也需要保持一致(安全连接或者不安全连接)!!!
- 关闭蓝牙设备
使用BluetoothAdapter的disable方法可以直接关闭当前设备!!
补充一点,使用socket通信时,需要在新的线程里处理,不然会造成主线程阻塞的!!!
好了,关于基本的功能就介绍到这里了,有兴趣的朋友可以关注我一下,有什么问题大家一起谈论一下!!
- Android蓝牙通讯(二)————蓝牙的相关操作
- Android蓝牙通讯(一)————蓝牙功能的相关权限
- Android蓝牙通讯(三)————蓝牙通讯的实现
- Android蓝牙相关—蓝牙打印
- Android蓝牙开发——蓝牙操作的步骤
- Android蓝牙开发教程(三)——蓝牙设备相互通讯
- Android深入浅出系列之Bluetooth—蓝牙操作(二)
- Android深入浅出系列之Bluetooth—蓝牙操作(二)
- Android深入浅出系列之Bluetooth—蓝牙操作(二)
- Android深入浅出系列之Bluetooth—蓝牙操作(二)
- Android深入浅出系列之Bluetooth—蓝牙操作(二)
- 蓝牙开发经验小结——蓝牙通讯
- 【android 蓝牙开发——传统蓝牙】
- Android蓝牙——自定义通讯框架FreeBlue
- android蓝牙开发——二
- android蓝牙(二)——接收数据
- Android之Bluetooth—蓝牙操作
- Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载
- dll注入到进程(C++)
- Java验证IP地址是否属于指定局域网网段
- 写出这个数 (20)
- 迪杰斯特拉算法的实现
- C++动态内存管理
- Android蓝牙通讯(二)————蓝牙的相关操作
- Maven的总结I
- ccf/公共钥匙盒
- 9. Palindrome Number(数学)
- xUbuntu16.04_64+python2.7+anaconda2+pycharm配置
- 30分钟掌握ES6/ES2015核心内容(上)
- hive 创建表时遇到问题 Failed to recognize predicate 'xxx'. Failed rule: 'identifier' in column specificat
- Struts2_001_使用 Filter 作为控制器的 MVC
- spring_springMvc-mybatis 整合教程