设置蓝牙设备 寻找局域网内可能或者匹配的设备 链接设备 设备之间的传输数据
首先经过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,假设返回为空,则没法继续执行了。好比:java
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
其次,调用isEnabled()来查询当前蓝牙设备的状态,假设返回为false,则表示蓝牙设备没有开启。接下来你需要封装一个ACTION_REQUEST_ENABLE请求到intent里面,调用startActivityForResult()方法使能蓝牙设备。好比:android
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
使用BluetoothAdapter类里的方法。你可以查找远端设备(大概十米之内)或者查询在你手机上已经匹配(或者说绑定)的其它设备了。编程
固然需要肯定对方蓝牙设备已经开启或者已经开启了“被发现使能”功能(对方设备是可以被发现的是你可以发起链接的前提条件)。假设该设备是可以被发现的。会反馈回来一些对方的设备信息,比方名字、MAC地址等。利用这些信息,你的设备就可以选择去向对方初始化一个链接。数组
假设你是第一次与该设备链接,那么一个配对的请求就会本身主动的显示给用户。当设备配对好以后,他的一些基本信息(主要是名字和MAC)被保存下来并可以使用蓝牙的API来读取。使用已知的MAC地址就可以对远端的蓝牙设备发起链接请求。
匹配好的设备和链接上的设备的不一样点:匹配好仅仅是说明对方设备发现了你的存在,并拥有一个共同的识别码。并且可以链接。链接上:表示当前设备共享一个RFCOMM信道并且二者之间可以交换数据。markdown
也就是是说蓝牙设备在创建RFCOMM信道以前。必须是已经配对好了的。app
在创建链接以前你必须先查询配对好了的蓝牙设备集以便选取一个设备进行通讯。好比你可以你可以查询所有配对的蓝牙设备,并使用一个数组适配器将其打印显示出来:oop
Set<BluetoothDevice> pairedDevices =mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
//Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
创建一个蓝牙链接仅仅需要MAC地址就已经足够。post
扫描设备,仅仅需要调用startDiscovery()方法,这个扫描的过程大概持续是12秒,应用程序为了ACTION_FOUND动做需要注冊一个BroadcastReceiver来接受设备扫描到的信息。对于每一个设备。系统都会广播ACTION_FOUND动做。 spa
// 用ACTION_FOUND为action注冊广播接收器
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
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());
}
}
};
//注冊广播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy时记得注销广播接收器
假设你想使你的设备可以被其它设备发现,将ACTION_REQUEST_DISCOVERABLE动做封装在intent中并调用startActivityForResult(Intent, int)方法就可以了。它将在不使你应用程序退出的状况下使你的设备可以被发现。缺省状况下的使能时间是120秒,固然你可以可以经过加入EXTRA_DISCOVERABLE_DURATION字段来改变使能时间(最大不超过300秒)好比:线程
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
执行该段代码以后,系统会弹出一个对话框来提示你启动设备使能被发现(此过程当中假设你的蓝牙功能没有开启。系统会帮你开启),并且假设你准备对该远端设备发现一个链接,你不需要开启设备被发现功能。因为该功能仅仅是在你的应用程序做为server端的时候才需要。
在应用程序中,想创建两个蓝牙设备之间的链接,必须实现client和server端的代码(因为不论什么一个设备都必须可以做为服务端或者client)。
一个开启服务来监听。一个发起链接请求(使用server端设备的MAC地址)。
当他们都拥有一个蓝牙套接字在同一RFECOMM信道上的时候。可以以为他们之间已经链接上了。服务端和client经过不一样的方式或其它们的蓝牙套接字。当一个链接监听到的时候,服务端获取到蓝牙套接字。
当客户可打开一个FRCOMM信道给server端的时候,client获取到蓝牙套接字。
注意:在此过程当中,假设两个蓝牙设备尚未配对好的。android系统会经过一个通知或者对话框的形式来通知用户。
RFCOMM链接请求会在用户选择以前堵塞。
当你想要链接两台设备时,一个必须做为服务端(经过持有一个打开的BluetoothServerSocket),目的是监听外来链接请求,当监听到之后提供一个链接上的BluetoothSocket给client。当client从BluetoothServerSocket获得BluetoothSocket之后就可以销毁BluetoothServerSocket,除非你还想监听不少其它的链接请求。
创建服务套接字和监听链接的基本步骤:
首先经过调用listenUsingRfcommWithServiceRecord(String, UUID)方法来获取BluetoothServerSocket对象,參数String表明了该服务的名称,UUID表明了和client链接的一个标识(128位格式的字符串ID,至关于PIN码),UUID必须两方匹配才干够创建链接。
其次调用accept()方法来监听可能到来的链接请求,当监听到之后,返回一个链接上的蓝牙套接字BluetoothSocket。
最后,在监听到一个链接之后。需要调用close()方法来关闭监听程序。(通常蓝牙设备之间是点对点的传输)
注意:accept()方法不该该放在主Acitvity里面,因为它是一种堵塞调用(在没有监听到链接请求以前程序就一直停在那里)。
解决方法是新建一个线程来管理。
好比:
为了初始化一个与远端设备的链接,需要先获代替表该设备的一个BluetoothDevice对象。经过BluetoothDevice对象来获取BluetoothSocket并初始化链接。详细步骤:
使用BluetoothDevice对象里的方法createRfcommSocketToServiceRecord(UUID)来获取BluetoothSocket。UUID就是匹配码。而后,调用connect()方法来。假设远端设备接收了该链接,他们将在通讯过程当中共享RFFCOMM信道,并且connect返回。
注意:conncet()方法也是堵塞调用,通常创建一个独立的线程中来调用该方法。
在设备discover过程当中不该该发起链接connect()。这样会明显减慢速度以致于链接失败。且传输数据完毕仅仅有调用close()方法来关闭链接,这样可以节省系统内部资源。
当设备链接上之后,每一个设备都拥有各自的BluetoothSocket。
就可以实现设备之间数据的共享了。
首先经过调用getInputStream()和getOutputStream()方法来获取输入输出流。
而后经过调用read(byte[]) 和write(byte[]).方法来读取或者写数据。
实现细节:觉得读取和写操做都是堵塞调用,需要创建一个专用线程来管理。
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />