Android 蓝牙开发基本流程

此例子基于 android demo

 

对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少     Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发;
    鉴于很多开发人员现在也有蓝牙开发的需求,也为了大家少走些弯路,先将我积攒的一点点在Android蓝牙开发经验与大家分享一下!

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

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

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

 

 

注:Android 6.0后需要加上

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" 

这个权限

然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,如下图,只有8个类

                
而我们需要用到了就只有几个而已:

    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

getState() 蓝牙状态这里要说一下,只有在 BluetoothAdapter.STATE_ON 状态下才可以监听,具体可以看andrid api;

这个方法也是我们获取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、获取本地蓝牙适配器

      BluetoothAdapter
mAdapter= BluetoothAdapter.getDefaultAdapter();

 2、打开蓝牙

      if(!mAdapter.isEnabled()){

//弹出对话框提示用户是后打开

Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enabler, REQUEST_ENABLE);

      //不做提示,强行打开

      // mAdapter.enable();

}

3、搜索设备
   1)刚才说过了mAdapter.startDiscovery()

是第一步,可以你会发现没有返回的蓝牙设备,怎么知道查找到了呢?向下看,不要急

2)定义BroadcastReceiver,关于BroadcastReceiver不多讲了,不是今天的讨论内容,代码如下

 

    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 (device.getBondState() != BluetoothDevice.BOND_BONDED) {

                    Log.v(TAG, "find device:" + device.getName()
                            + device.getAddress());
                }
            }
            //搜索完成
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
                    .equals(action)) {
                setTitle("搜索完成");
                if (mNewDevicesAdapter.getCount() == 0) {
                    Log.v(TAG, "find over");
                }
            }
        }
    };

 这样,没当查找到新设备或是搜索完成,相应的操作都在上段代码的两个if里执行了,不过前提是你要先注册

 

BroadcastReceiver,具体代码如下

 

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(mReceiver, filter);
    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(mReceiver, filter)<span style="font-family:SimSun;">;</span>


(这段代码,一般写在onCreate()里..)
  4、建立连接,首先Android sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接(说的不对请高人指正),服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接

 

1)服务器端:


//UUID格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到

        //http://www.uuidgenerator.com 申请


BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);
serverSocket.accept();


2)客户端:
//还记得我们刚才在BroadcastReceiver获取了BLuetoothDevice么?
BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);
clienSocket.connect();


5、数据传递,通过以上操作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式
1)获取流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
2)写出、读入
这是基础的东西,在这就不多赘述了
终于写完了,这是我这两天的学习经验,希望对有蓝牙需求的朋友有所帮助!另外,之前我们提过

android.bluetooth下有8个类,还有4个类没有用到,那4个类里定义的都是常量,我也没用到它们..

 

  最后把我找到的几个蓝牙的例子附在后面,希望从事软件开发,尤其是Android开发的朋友以后多沟通、多分享!

补充一下,使设备能够被搜索

Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

startActivityForResult(enabler,REQUEST_DISCOVERABLE);

 

demo是包括客户端和服务端;分别放到两个手机上就可以通信;大家改改应该就可以用;

http://download.csdn.net/detail/q610098308/8681065
这个是官方的demo:
http://download.csdn.net/detail/q610098308/8628675

 

https://edu.csdn.net/course/detail/24723 Android bluetooth 蓝牙通信 视频教程

 

  • 75
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
### 回答1: Android 开发例程是为了在 Android 设备上实现功能而提供的一套代码范例。它包含了一系列的步骤和方法,帮助开发者理解和实现通信。 首先,在开发应用程序之前,需要在 AndroidManifest.xml 文件中添加权限,以确保应用程序具有与设备进行通信的权限。 然后,需要在应用程序中初始化 BluetoothAdapter 对象。通过该对象,可以获取设备上的适配器,以便进行相关操作。 接下来,可以通过调用 BluetoothAdapter 的方法来进行设备的扫描、配对和连接。比如,使用 startDiscovery() 方法来开始扫描附近的设备,使用 createBond() 方法来配对设备,使用 connectGatt() 方法来连接设备等等。 在设备连接成功后,可以使用 BluetoothSocket 对象来进行数据的传输。通过该对象,可以实现数据的读取和写入。读取数据可以使用 InputStream 的 read() 方法,写入数据可以使用 OutputStream 的 write() 方法。 此外,还可以注册广播接收器来接收相关的系统事件。例如,可以注册 ACTION_FOUND 广播用于接收到新的设备时的通知,或者注册 ACTION_STATE_CHANGED 广播用于接收状态变化的通知。 总而言之,Android 开发例程提供了一套完整的代码指南,帮助开发者在 Android 设备上实现功能。通过了解和使用这个例程,开发者可以更轻松地开发出与设备进行交互的应用程序。 ### 回答2: Android开发例程是用于在Android平台上实现通信功能的示例代码。开发者可以根据这个例程,快速地了解和掌握Android开发基本原理和操作步骤。 开发的主要步骤包括:扫描设备、建立连接、发送和接收数据等。在Android开发例程中,通常会包含以下功能的示例代码: 1. 初始化适配器:获取系统中唯一的适配器实例,并判断设备是否支持功能。 2. 扫描设备:开启扫描功能,搜索周围的设备,并展示设备名称和地址等相关信息。 3. 建立连接:通过设备的地址,与指定的设备建立连接。连接成功后可以进行数据的发送和接收。 4. 发送和接收数据:通过连接发送数据到远程设备,同时可以实时地接收远程设备发送的数据。 5. 断开连接:在通信完成后,主动关闭连接,释放资源。 在实际的开发中,开发者可以根据具体的需求和场景,对例程中的代码进行扩展和优化。例如可以添加配对验证、设置通信模式、设备搜索过滤等功能。 总之,Android开发例程提供了一个入门级的示例,对于初学者来说是非常有帮助的。通过学习和理解这些示例代码,开发者可以更快地实现自己的应用,并大大提高开发效率。 ### 回答3: Android开发例程一般包括以下几个步骤: 1. 获取适配器:通过调用系统的BluetoothAdapter类的getDefaultAdapter()方法获取适配器实例。 2. 检查功能是否支持:使用isEnabled()方法判断功能是否开启。若未开启,可以使用enable()方法进行启用。 3. 搜索设备:使用startDiscovery()方法启动设备搜索,通过继承BroadcastReceiver类并实现其onReceive()方法来接收设备搜索结果。可以在onReceive()方法中获取搜索到的设备信息。 4. 配对设备:可以通过调用BluetoothDevice类的createBond()方法来进行设备的配对。 5. 连接设备:使用BluetoothSocket类来创建一个与目标设备的连接,并通过该连接来发送和接收数据。 6. 监听连接状态:使用BluetoothAdapter类的listenUsingRfcommWithServiceRecord()方法来监听连接状态,可以通过继承BluetoothServerSocket类并实现其accept()方法来监听连接请求。 7. 与设备进行数据交互:通过BluetoothSocket类的getOutputStream()获取输出流,通过其write()方法向设备发送数据;通过getInputStream()获取输入流,通过其read()方法读取设备发送的数据。 8. 关闭连接:使用BluetoothSocket的close()方法关闭连接。 需要注意的是,开发涉及到多线程操作,为了避免阻塞UI线程,建议将相关操作放在异步线程中进行。此外,还需在AndroidManifest.xml文件中添加相应的权限和相关声明,如ACCESS_COARSE_LOCATION、BLUETOOTH、BLUETOOTH_ADMIN等。 以上是Android开发的一般流程和步骤,具体开发过程需要根据具体需求进行调整和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值