Android 蓝牙编程 其实很简单
与蓝牙相关的API
1。BluetoothAdapter
该类的对象代表了本地蓝牙适配器;
比如程序运行在我的手机上,那么我的手机的蓝牙就用它来代表
也就是主机
2.BluetoothDevice:
代表了一个远程的Bluetooth;
也就是从机;
3.BluetoothServerSocket:
这个类就好比 java中的 serversocket
4.BluetoothSocket:
这个类就好比 java中的 socket
第一步 获得 本地蓝牙的 适配器
要想对蓝牙操作 一般还需要在manifest中添加权限
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
上面这句是对蓝牙操作所必须声明的权限
下面这句是在你对蓝牙进行一些设置的时候需要的权限,比如说开启蓝牙,设置可见时间等等。。。
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
首先获得本地适配器
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
之后判断 设备是否有蓝牙
通过 判断 adapter 是否为 null
接着再通过 adapter.isEnable()判断蓝牙是否已经开启,如果没有
使用一下系统的Intent的将其开启
Intent intent = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
一般将这个 放在onResume中操作,这样 开启之后,就会回到onResume中,执行你判断开启之后的操作
下面 可以在判断开启之中进行操作,比如说获取已配对设备列表,
Set<BluetoothDevice> devices = adapter.getBondedDevices();
之后 通过 迭代 获得每一个 设备device
然后 对 这个 device 进行相应的操作
比如说
String address = device.getAddress();
//getName() 获得设备名称
//device.getBondState();获得绑定状态, 比如说 返回数字12的话 就是已经绑定
如果需要 设置设备可以被发现
Intent intent = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
// Android 默认最多只能保持300秒的可见性,改为500也只会为300s,这个可以在 启动这个 intent的时候
//Android会跳出一个对话框,上面只会显示 300s
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 500);
startActivity(intent);
之后 如果需要 扫描设备的话
就是用 adapter.startDiscovery();
这个调用之后 ,系统将会广播其状态和其扫描的设备列表,而且每找到一个就返回一个 ,他是异步工作的。
所以这里 我们需要注册广播来接收。
首先 就需要实例化一个过滤器,而这个过滤器就是过滤广播 信息 BluetoothDevice.ACTION_FOUND ,该信息表明Android 发现设备的消息的
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
然后我们使用 registerReceiver(receiver, filter);注册广播接收器
其中receiver为我们 新建一个 内部类 Receiver extends BroadcastReceiver{}的实例
然后我们就可以在 Receiver()里获取发送这个 广播的intent,然后获取该设备bluedevice
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String address = device.getAddress();
int device_state = device.getBondState();
String device_name = device.getName();
Log.d("my", "--地址" + address + "--是否绑定? " + device_state
+ " --设备名称" + device_name);
tvShow.setText(address + device_state + device_name);
device_mac = address;
}
以上就是扫描设备,API中说 adapter.startDiscovery();这个会扫描12秒,那么我们其实可以检测一下是不是
通过 在 filter上添加两个动作 搜索设备开始,和探索设备结束
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
之后在仍然在 Receiver中如上 一样 判断 Action ,之后打印时间。
if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
Log.d("my", "扫面开始时间" + System.currentTimeMillis());
}
if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
Log.d("my", "扫描结束时间" + System.currentTimeMillis());
}
可以看出差不多是12秒
时间不早了 哥得去吃饭了。
下次再说 Android 蓝牙的 发送数据 和接收 数据。