`
jiav_net
  • 浏览: 103073 次
文章分类
社区版块
存档分类
最新评论

android蓝牙开发 蓝牙设备的查找和连接

 
阅读更多
Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发。

1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限

// 管理蓝牙设备的权限

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />

// 使用蓝牙设备的权限

<uses-permissionandroid:name="android.permission.BLUETOOTH" />

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

// 检查设备是否支持蓝牙    
adapter = BluetoothAdapter.getDefaultAdapter();   
if (adapter == null)   
{   
    // 设备不支持蓝牙    
}   
// 打开蓝牙    
if (!adapter.isEnabled())   
{   
    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<BluetoothDevice> devices = adapter.getBondedDevices();   
for(int i=0; i<devices.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(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);   
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);   
// 注册广播接收器,接收并处理搜索结果    
context.registerReceiver(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.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);   
            System.out.println(device.getName());   
       }   
   }   
}

5.蓝牙设备的配对和状态监视

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.getParcelableExtra(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);   
                        } catch (Exception e) {    
                            e.printStackTrace();   
                        }   
                        break;   
                    // 已配对    
                    case BluetoothDevice.BOND_BONDED:   
                        try {   
                            // 连接    
                           connect(device);   
                        } catch (IOException e) {   
                            e.printStackTrace();   
                        }   
                        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指定连接的那个远程蓝牙设备


分享到:
评论

相关推荐

    Android之蓝牙驱动开发总结.pdf

    Android蓝牙开发必备,是初学者,初级工程师学习Android 蓝牙的必备手册。 主要分为三部分 1.打开蓝牙; 2.查找附近已配对或可用的设备; 3.连接设备; 4.设备间数据 交换。

    BLE-和经典蓝牙Android编程说明

    BLE-和经典蓝牙Android编程说明 蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主角色,另一为从角色,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。 理论上,一个...

    Android蓝牙串口传输心电数据画图的小程序

    可以查找蓝牙设备,建立连接,传输心电数据并画出波形图。 如果要进行测试,请在有蓝牙适配器的电脑上安装支持虚拟蓝牙串口的驱动,如IVT WILDCOM等。用手机搜索电脑,配对完成后建立连接,电脑任务栏将会出现“设备...

    android蓝牙通信查找以及绑定

    android实现蓝牙通信的查找与绑定,通过列表展示可以查找到的蓝牙,可以对当前查找到的蓝牙进行绑定

    Android蓝牙开发详解.pdf

    基础知识,蓝牙权限,蓝牙设置,搜索设备,查找匹配设备,扫描设备,使能被发现,连接设备,作为服务器示例,作为客户端示例,管理连接示例,使用配置文件,Vendor-specific指令,医疗设备模式,创建一个HDP应用

    局域网android设备发现功能,包括udp发现和蓝牙发现,可进行连接通信

    局域网android设备发现功能,包括udp发现和蓝牙发现,可进行连接通信 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]

    android 蓝牙

    android 小程序, 蓝牙通信, ANDROIDSTUDIO编译, 查找,连接, 发送数据. 己调通与NORDIC蓝牙IC通信

    android 蓝牙开发

    本人在公司做的一款app软件需要用到蓝牙,我负责了蓝牙发开。但本人从接触过蓝牙开发,只能从网上查找资料,整理,终于实现了蓝牙的开启搜索,配对,解除配对等功能。

    ANDROID蓝牙编程.doc

    ANDROID蓝牙编程.doc 用BluetoothAdapter类,你能够在Android设备上查找周边的蓝牙设备然后配对(绑定),蓝牙通讯是基于唯一地址MAC来相互 传输的,考虑到安全问题Bluetooth通讯时需要先配对。然后开始相互连接,连接...

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。...17.3.6 查找蓝牙设备 471 17.3.7 管理连接 476 17.3.8 互相之间的通信 480 17.4 WiFi通信 484 17.4.1 管理WiFi 484 17.4.2 扫描热点 487 17.4.3 Socket通信 489

    老罗android开发视频教程全集百度网盘下载

    Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理,实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/...

    BLE和经典蓝牙Android编程说明

    蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主角色,另一为从角色,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。理论上,一个蓝牙主端设备,可同时与7个蓝牙从...

    Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法

    蓝牙搜索到设备需要用到定位服务,所以在开发中 targetSdkVersion 大于等于23(6.0) 需要在代码中进行权限获取 需要在配置文件中申请两个权限: &lt;uses android:name=android.permission.ACCESS_COARSE_LOCATION/&gt; ...

    Android高级编程--源代码

    和任何其他产品早期的发行版一样,Android的软件和开发库还会经历很多正常的改进和完善。本书的内容和示例提供了如何使用当前SDK来编写优秀的移动程序所需要的基础知识,同时也保持了快速适应未来版本...

    蓝牙串口android 源码(收发都可用,修正android6.0 以后问题)

    蓝牙串口android 源码, 在共享源码上修改android6.0 以后的无法查找设备问题,已经测试可用, 本人在手机和mt2502 开发板连接可以正常通过蓝牙串口通讯。

    Android系统中的蓝牙连接程序编写实例教程

    主要介绍了Android系统中的蓝牙连接程序编写实例教程,包括蓝牙的设备查找及自动配对等各种基础功能的实现,十分给力,需要的朋友可以参考下

    Android 蓝牙工程 亲测可运行 搜索 链接 发送 接收一应俱全

    亲测可运行,并有详细注释,带有搜索 连接 发送数据 接收数据

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

Global site tag (gtag.js) - Google Analytics