Android 蓝牙设备的查找与连接

1,添加蓝牙设备的权限,6.0以上动态权限

 管理蓝牙设备的权限  使用蓝牙设备的权限 

2,检查是否支持蓝牙并打开

获得蓝牙设备器(android.bluetooth.BluetoothAdapter),检查该设备是否支持蓝牙,如果支持就打开蓝牙

adapter = BluetoothAdapter.getDefaultAdapter();if(adapter = null) {    //设备不支持蓝牙}//打开蓝牙if(!adapter.isEnable) {    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);    //设置蓝牙可见性,最多300秒    intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);    context.startActivity(intent);}
3,获取已匹配的蓝牙设备(android.bluetooth.BluetoothDevice)

首次连接蓝牙设备,一旦配对成功,该设备的信息会被保存,以后连接时无需在配对,所以已配对的设备不一定是能连接的

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();Set device = adapter.getBondedDevices();for(int i=0,int j=device.size();i    BluetoothDevice device = (BluetoothDevice) devices.iterator().next();    System.out.println(device.getName();}
4,搜索周边的蓝牙设备

适配器搜索蓝牙设备后将结果以广播的形式传出去,所以需要自定义一个继承广播的类,在onReceive方法中获得并处理蓝牙设备的搜索结果

//设置广播信息过滤IntentFilter intentFilter = new IntentFilter();intentFilter.AddAction(BluetoothDevice.ACTION_FOUND);intentFilter.AddAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);intentFilter.AddAction(BluetoothDevice.ACTION_SCAN_MODE_CHANGED);intentFilter.AddAction(BluetoothDevice.ACTION_START_CHANGED);//注册广播接收器,接收并处理搜索结果context.registerReciver(receiver, intentFilter);//寻找蓝牙设备,android 会将结果以广播的形式发送出去adapter.startDiscovery();//自定义广播类private BroadcastReceiver receiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        if(BluetoothDevice.ACTION_FOUND.equals(action)){            BluetoothDevice device = intent.getParcelbleExta(BluetoothDevice.EXTRA_DEVICE);            System.out.println(device.getName());            //如果查找到的设备符合要连接的设备,处理            if(device.getName().equalsIgnoreCase(name)) {                //搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备,要及时关闭搜索                adapter.cancelDiscovery();                //获取蓝牙设备的连接状态                connectState = device.getBondState();                switch(connectState) {                    //未配对                    case BluetoothDevice.BOND_NONE:                        //配对                        try{                            Method createBondMethod = BluetoothDevice.class.getMethod("createBond");                              createBondMethod.invoke(device);                             break;                    case BluetoothDevice.BOND_BONDED:                        try{                            //连接                            connect(device);                        }catch{}                        }                        break;                }            }        }} else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {                // 状态改变的广播                  BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);                if (device.getName().equalsIgnoreCase(name)) {                     connectState = device.getBondState();                    switch (connectState) {                        case BluetoothDevice.BOND_NONE:                            break;                        case BluetoothDevice.BOND_BONDING:                            break;                        case BluetoothDevice.BOND_BONDED:                            try {                                // 连接                                  connect(device);                            } catch (IOException e) {                                e.printStackTrace();                            }                            break;                    }                }            }     }}
6.蓝牙连接
private void connect(BluetoothDevice device)throws IOException{    //固定的UUID    final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";        UUID uuid = UUID.fromString(SPP_UUID);        BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);        socket.connect();    }

注:本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-12/48374.htm

其他:

1.BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立 bluetoothSocket连接之前,都要不断操作它

BluetoothAdapter里的方法很多,常用的有以下几个:

  • cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索
  • disable()关闭蓝牙
  • enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enabler,reCode);//同startActivity(enabler);
  • getAddress()获取本地蓝牙地址
  • getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter
  • getName()获取本地蓝牙名称
  • getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备
  • getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)
  • isDiscovering()判断当前是否正在查找设备,是返回true
  • isEnabled()判断蓝牙是否打开,已打开返回true,否则,返回false
  • listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步
  • startDiscovery()开始搜索,这是搜索的第一步
2.BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备
  • createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket
这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter
3.BluetoothServerSocket如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,

这个类一种只有三个方法
两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!
还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接
- close()这个就不用说了吧,翻译一下——关闭!
4.BluetoothSocket,跟BluetoothServerSocket相对,是客户端

共5个方法,不出意外,都会用到
  • close(),关闭
  • connect()连接
  • getInptuStream()获取输入流
  • getOutputStream()获取输出流
  • getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备

更多相关文章

  1. Android Studio查看源码时出现Sources for ‘Android API 30 Pla
  2. Android中Canvas绘图方法的实现
  3. 安卓之 (解决方法)指定安装应用迁移到SD卡
  4. android 使用statfs获得文件路径可用空间大小的方法
  5. android无线调试方法
  6. Android Root方法原理解析及Hook(四) GingerBreak
  7. 【Android Developers Training】 42. 从另一台设备接收文件
  8. 32、adb INSTALL_FAILED_TEST_ONLY 处理方法

随机推荐

  1. Android(安卓)Secret Code
  2. Android的事件分发机制
  3. android 图形展示
  4. Android自定义Toast的时长、位置、及显示
  5. SlidingDrawer源码分析
  6. Android布局优化之Include(一)
  7. Android画图之Matrix(二)
  8. Android中socket(tcp|udp),websocket基本
  9. Android(安卓)Camera数据流分析全程记录
  10. Accessibility辅助功能--一念天堂,一念地