蓝牙有关的操作

来源:互联网 发布:淘宝直播时怎么调镜像 编辑:程序博客网 时间:2024/06/05 00:23

用广播来蓝牙操作
我们在不开启手机自身的蓝牙开关情况下,对蓝牙打开和扫描,并列表的形式展现出来.
1.首先在添加权限,在配置文件中进行添加即可;

<use-permission android :name="android.permission.BLUETOOTH">

获取蓝牙适配器,就是机身的蓝牙适配器对象,所有与本机蓝牙有关的Activity都需要BlueAdapter对象,表示为设备自身的蓝牙适配器:

BlueToothAdapter ba=BlueAdapter.getDefaultAdapter();if(ba=null){  //该设备不支持蓝牙功能...}

2.接下来打开蓝牙,并监听蓝牙状态变化获取打开与否的信息

if(!ba.isEnable){ ba.enable();//强行打开蓝牙,也可以调用本地的api去打开 //用api打开蓝牙设备的思路是Intent启动本地的方法,然后在onActivityResult()中获取到打开信息}

如果我们想确切的知道是否打开的信息,可以通过注册广播来监听ACTION_STATE_CHANGED这个广播意图来知道蓝牙的改变状态,然后再去执行有关的业务.这个广播就是就是表征蓝牙的状态变化的,包括打开,关闭,这也是本文想描述的.当我们不知道本机的蓝牙功能是否开启的时候,就可以通过这种方式来确认;

BroadcastReceiver receiver=new BroadcastReciever(){public void onReceive(Context context, Intent intent) {  if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {      if(ba.getState()==BluetoothAdapter.STATE_ON){         //蓝牙打开后执行...      }      if(ba.getState()==BluetoothAdapter.STATE_OFF){         //蓝牙关闭后执行...      }    }           };IntentFilter intentfilter=newIntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);registerReceiver(receiver,intentfilter);

上面是判断蓝牙是否开启,其中还在intent中取出字段来判定情况.很显然这里还可以判定蓝牙状态关和闭下分别执行对应的业务逻辑.为什么我们不能直接在打开蓝牙之后就去执行相应的任务呢?因为蓝牙打开是耗时的过程,是另外的一个进程执行的业务,很显然是不能直接去进行搜索设备的.如果在ba.enable()之后直接进行搜索,就会卡主,或者没显示.这个时候利用广播去监听就显得很为便利.因为广播实现的过程本身是进程之间Binder通信来完成的.如果本机的蓝牙是开启的话,就直接在前面的ba.isEnable()判断中去执行搜索设备.

3.显示搜索到设备展示出来
搜索设备也是一个耗时的过程,该过程是异步的.在Android手机设备中,系统会有一个广播ACTION_FOUND的意图,一旦设备被搜索到之后,就会发送一个广播,那么在本机中注册一个ACTION_FOUND 的广播的话,就能接收所搜索到设备的消息.如下展示:

BroadcastReceiver btreciever=new BroadcastReceiver(){        @Override       public void onReceive(Context context, Intent intent) {          String action = intent.getAction();          if (action.equals(BluetoothDevice.ACTION_FOUND)){             BluetoothDevice devices = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);             arrayAdapter.add(devices.getName()+"\n"+devices.getAddress());            //用列表的形式将设备展现出来          }        }    };

认识一下这里的BluetoothDevice蓝牙设备,BluetoothDevice其实是一个能够跨进程传递的对象,封装了有关蓝牙设备的若干信息,而且实现了Parcelable接口,从上面的getParcelableExtra()方法中接可以看出来.这里之获取到了设备的名称和地址,也有其他的信息,可以去看一下源码.

4.配对和连接
这里展示作为客户端进行连接.客户端连接蓝牙需要两个步骤,
第一步:调用BluetoothDecives的方法,createRfcommSocketToServiceRecord(MY_UUID)获取一个BluetoothSocket对象;

UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

第二步:然后调用BluetoothSocket的connect()方法,这个方法是一个阻塞的方法.可以利用AsyncTask来实现连接.定制一个ClinetTask()连接任务,将要连接的设备绑定客户端任务即可.

class ClientTask extends AsyncTask<Void, Integer, Integer> {           BluetoothDevice bd;       BluetoothSocket bs;        public ClientTask(BluetoothDevice bd) {            this.bd = bd;            try {                bs = bd.createRfcommSocketToServiceRecord(MY_UUID);            } catch (IOException e) {                e.printStackTrace();            }        }        @Override        protected Integer doInBackground(Void... params) {            bluetoothAdapter.cancelDiscovery();                // 停止搜索,开始连接热点,如果不停止,容易导致连接失败            try {              bs.connect();              //开始连接,这是一个阻塞的方法,这个过程有12秒的时间,可以在此做连接通信                           } catch (IOException e) {                e.printStackTrace();            } finally {                try {                    bs.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            return null;        }    }

连接完成之后,是通过获得流来通信的.分别使用getInputStream和getOutputStream获取输入和输出流处理传输.

0 0
原创粉丝点击