安卓蓝牙开发知识

#应用开发API
使用Android API进行蓝牙通信,需要完成四个主要工作:建立蓝牙,寻找附近配对的或者可以使用的蓝牙设备,连接设备,在设备间传递数据。
所有的API都在android.bluetooth包中,在建立蓝牙连接中所需要使用的类和接口如下:

BluetoothAdapter:代表本地蓝牙适配器(Bluetooth Radio)。该BluetoothAdapter是入口点的所有蓝牙互动。利用这一点,你会发现其他蓝牙设备,查询保税(配对)的设备列表,使用已知的MAC地址实例化一个BluetoothDevice类,并创建一个BluetoothServerSocket来监听来自其他设备的通信。

BluetoothDevice:代表一个远程蓝牙设备。使用它可以请求与远程设备的连接,通过一个BluetoothSocket或者关于设备的名称,地址,类别和键合状态的查询信息。

BluetoothSocket:代表了一个蓝牙套接字(类似于TCP套接字)的接口。这是一个连接点,允许应用程序通过InputStream和OutputStream与其他蓝牙设备交换数据。

BluetoothServerSocket:代表一个侦听传入的请求的开放服务器套接字(类似于TCP的ServerSocket)。为了连接两个Android设备,一台设备必须打开这个类服务器套接字。一个远程蓝牙设备发送连接请求到该设备,当连接被接受后BluetoothServerSocket会返回一个连接的BluetoothSocket。

BluetoothClass:描述蓝牙设备的一般特点和能力。这是一组只读的定义了设备主要和次要的类以及服务的属性。然而,这并不能可靠地描述所有的蓝牙协议和设备支持的服务,但作为一个提示的设备类型是有用的。

BluetoothProfile:一个表示蓝牙协议的接口。蓝牙协议是一个设备之间基于蓝牙通信的无线接口规范。比如免提协议(Hands-Free)。
BluetoothHandset:对蓝牙耳机可被手机使用提供了支持。包括蓝牙耳机(Bluetooth Headset)协议和免提(Hands-Free V1.5)协议。

BluetoothA2dp:定义了高品质的音频怎样通过蓝牙连接以流的方式从一个设备传输到另一个设备。“A2DP”代表高级音频传输模式(Advanced Audio Distribution Profile)。

BluetoothHealth:代表控制蓝牙服务的健康设备协议代理。

BluetoothHealthCallback:用来实现BluetoothHealth回调的抽象类。你必须继承这个类并实现回调方法来接收有关更改应用程序的注册状态和蓝牙信道状态的更新。

BluetoothHealthAppConfiguration:表示蓝牙健康第三方应用程序注册与远程蓝牙健康设备进行通信的应用程序配置。

BluetoothProfile. ServiceListener:当BluetoothProfile IPC客户端已经连接到或从服务(一个运行特定协议的内部服务)断开连接时,通知该客户端的接口。

#蓝牙权限

 <!--蓝牙权限 :请求连接,接受连接以及交换数据中,需要用到该权限-->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <!--蓝牙权限:实例化蓝牙设备的搜索或者对蓝牙的设置进行操作-->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

检查是否有蓝牙

若 mBluetoothAdapter == null 则手机无 蓝牙设备

BluetoothAdapter  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

检查蓝牙目前是否可用

蓝牙不可用开启蓝牙

//检查蓝牙目前是否可用
if (!mBluetoothAdapter.isEnabled()) {
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_ENABLE_BT){
            if(resultCode == RESULT_OK){
                SnackbarUtil.show(activityMain,"蓝牙设备开启");
            }else if(resultCode == RESULT_CANCELED){
                SnackbarUtil.show(activityMain,"蓝牙设备取消开启");
            }
        }
    }

获取设备列表

/**
     * 获取配对设备列表
     *
     * 在搜索设备之前,有必要查询已配对的设备集,来得知想要连接的设备是否已经配对。
     * 为了执行上述操作,可以调用getBondedDevices()方法。
     * 该方法返回一个BluetoothDevice的集合来代表配对设备。
     *
     */
    private void getBondedDevices(){
        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {//遍历设备
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        }
    }

搜索设备

 /**
     * 搜索设备
     *
     * 执行发现设备的操作,仅仅需要执行startDiscovery()方法。该过程是异步的,
     * 该方法将会立刻返回一个布尔值表明搜索是否已经开始
     * 。通常情况下,该搜索的过程调用12秒钟的查询,随后返回找到的设备。
     *
     *
     * 你的应用程序必须使用ACTION_FOUNDd的Intent注册一个BroadastReceiver。
     * 该Intent用来接受每一个查找到设备的信息。对于每一个设备,系统将会广播ACTION_FOUND。
     * 该Intent包含两个额外域,EXTRA_DEVICE 和 EXTRA_CLASS。
     * 分别包含一个BluetoothDevice类对象和BluetoothClass类对象
     *
     * 如果已经进行了连接,那么搜索操作将会显著地降低连接的速率,因此你应当在连接时停止搜索。
     * 可通过cancelDiscovery()方法停止搜索。
     */
    private void search(){
        mBluetoothAdapter.startDiscovery();
//        mBluetoothAdapter.cancelDiscovery();//停止搜索。
    }


 /**
     * 搜索设备的广播注册
     */
    private void registerReceiver(){
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
    }

    /***
     * 搜索设备的广播监听
     */
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {//发现设备
                //从Intent获取蓝牙设备
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                //为了显示扫描的设备
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

开启蓝牙可见性

 /**
     * 使自己的蓝牙设备可见
     *
     * 使用ACTION_REQUEST_DISCOVERABLE的Intent,调用startActivityForResult(Intent, int)方法即可。
     * 这将会通过系统设置请求开启搜索模式。默认情况下,设备将在120秒内可见。
     * 你可以定义不同的时间长度,通过添加Intent的extra: EXTRA_DISCOVERABLE_DURATION即可。
     * 该时长最大为3600秒,最小为0,超出该范围的值都会被设为120秒。其中,0表示设备始终处于可见状态
     *
     * 在onActiviyResult()中返回和时限相同的result code。如果用户选择“否”,那么result code将为ESULT_CANCELED。
     *
     * 设备将在指定时间内保持可见。如果你想要检查状态的变化,
     * 可以通过使用ACTION_SCAN_MODE_CHANGED的Intent注册广播进行监听。
     * 该广播onReceive()的Intent包含两个额外域:EXTRA_SCAN_MODE 和 EXTRA_PREVIOUS_SCAN_MODE,
     * 分别表示新旧状态。可能的值有:SCAN_MODE_CONNECTABLE_DISCOVERABLE(可连接可见),
     * SCAN_MODE_CONNECTABLE(可连接但不可见) 或 SCAN_MODE_NONE(不可连接不可见)。

     *
     * 开启可见性仅仅在你的应用中作为服务端时才是必要的。
     */
    private void setDisCoverable(){
        Intent discoverableIntent = new
                Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DIRCOVERABLE_TIME);
        startActivity(discoverableIntent);
    }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页