Android蓝牙通讯(二)————蓝牙的相关操作

来源:互联网 发布:网络接入服务商怎么查 编辑:程序博客网 时间:2024/05/22 10:25

接着上一篇博客说,当我们把蓝牙的权限部分解决了之后,就可以使用蓝牙的相关的功能了!
基本功能包括:

  • 打开蓝牙
  • 设置蓝牙的可见性
  • 开始搜索周边可见设备
  • 尝试连接设备
  • 取消搜索周边设备
  • 关闭蓝牙

    下面就上面的基本操作给出相关的介绍和代码:

  • 打开蓝牙
    打开蓝牙有两种方式,我们可以通过BluetoothAdapter直接使用enable方法,直接打开蓝牙设备,这种方法不会询问/通知用户蓝牙的状态被改变(不过我们国内的用户不用担心这些事情,国内的手机需要通过CTA测试,测试中要求蓝牙设备被打开时需要给用户提示!! 贴心)。

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) {    // 判断手机中是否有蓝牙设备}mBluetoothAdapter.enable();//打开蓝牙

除了上述的方法之外,我们也可以通过使用Intent来打开蓝牙,这种方法需要用户的互动,只用用户点击确认时才会正常的打开蓝牙。

if (!mBluetoothAdapter.isEnabled()) {    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}
  • 设置蓝牙可见性
    在打开蓝牙时,蓝牙时默认不可见的,也就是说,其他的蓝牙不能搜索到本设备,需要通过设置蓝牙的可见性,让其他的设备可以搜索到本设备。设置可见性的方法如下:
Intent discoverableIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverableIntent);

可见性的时间由EXTRA_DISCOVERABLE_DURATION设定,取值范围在0~3600秒之间,当设置为0的时候表示蓝牙设备永远可见,如果设置的时间不在0~3600之间,时间会被默认设置为300秒。如果在设置可见性,蓝牙设备没有打开,设备将会被自动打开!!!

  • 开始搜索周边设备
    在我们回去本地的BluetoothAdapter对象后,可以直接通过使用startDiscovery发现周围设备!
    使用方法很简单,如下:
if(mBluetoothAdapter != null && mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON){    mBluetoothAdapter.startDiscovery();}

现在,我们可以搜索周围的设备了,现在问题来了,我们怎么获取已经搜索到的设备呢?答案是:广播,android在每检测到一件设备时,都会往上层放送一个广播,广播中会包含BluetoothDevice对象!
广播如下:

//定义广播BroadcastReceiver mReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())){                  //更新相关提示UI            }            if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())){                  //更新相关提示UI            }            if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())){                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);             }        }    };    //注册广播    IntentFilter mFilter = new IntentFilter();    mFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);    mFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);    mFilter.addAction(BluetoothDevice.ACTION_FOUND);    registerReceiver(mReceiver,mFilter);

我们可以在广播的回调中不断的获取搜索到的设备!

  • 取消搜索
    使用cancelDiscovery方法取消当前的搜索!如下:
 mBluetoothAdapter.cancelDiscovery();
  • 尝试连接设备(作为客户端)
    在连接设备时,需要使用BluetoothSocket和BluetoothDevice,作为客户端时,使用BluetoothDevice产生一个BluetoothSocket,如下所示:
BluetoothDevice mDevice = .....BLuetoothSocket mClientSocket;mClientSocket = mDevice.createInsecureRfcommSocketToServiceRecord(UUID_INSECURE);mClientSocket.connect();

UUID_INSECURE是“Universally Unique Identifier”的缩写,通用唯一识别码的意思。对于蓝牙设备,每个服务都有一个与它对应的UUID(唯一的)。
这里创建的socket是不安全的连接,这种连接是不需要配对校验的,当然也可以创建安全的连接(createRfcommSocketToServiceRecord(UUID_INSECURE))。
当然了,如果想要连接成功,服务端那边需要监听连接,否则无法连接成功的!!

  • 尝试连接设备(作为服务器端)
    需要使用BluetoothAdapter和BluetoothServerSocket,使用BluetoothAdapter产生一个BluetoothServerSocket对象,通过这个对象监听这个socket端口。
    如下:
private BluetoothServerSocket mServerSocket;private BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();mServerSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord("bluetooth",UUID_INSECURE);

需要指出的是,BluetoothServerSocket和BluetoothSocket的创建需要使用相同的UUID。socket的类型也需要保持一致(安全连接或者不安全连接)!!!

  • 关闭蓝牙设备
    使用BluetoothAdapter的disable方法可以直接关闭当前设备!!

补充一点,使用socket通信时,需要在新的线程里处理,不然会造成主线程阻塞的!!!

好了,关于基本的功能就介绍到这里了,有兴趣的朋友可以关注我一下,有什么问题大家一起谈论一下!!

阅读全文
0 0
原创粉丝点击