需要用到本地蓝牙适配器
- // 获取本地蓝牙适配器
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
判断是否支持蓝牙,并确认打开该功能。
- // 判断手机是否支持蓝牙
- if (mBluetoothAdapter == null) {
- Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
- finish();
- }
- // 判断是否打开蓝牙
- if (!mBluetoothAdapter.isEnabled()) {
- // 弹出对话框提示用户是后打开
- Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
- startActivityForResult(intent, 1);
- // 不做提示,强行打开
- // mBluetoothAdapter.enable();
- }else {
- // 不做提示,强行打开
- mBluetoothAdapter.enable();
- }
获取手机已经配对的蓝牙设备
- // 获取已经配对的设备
- Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
- .getBondedDevices();
- // 判断是否有配对过的设备
- if (pairedDevices.size() > 0) {
- for (BluetoothDevice device : pairedDevices) {
- // 遍历
- mDevicesList.add(device.getAddress());
- tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");
- }
- }
注册异步搜索蓝牙设备的广播
- // 找到设备的广播
- IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- // 注册广播
- registerReceiver(receiver, filter);
- // 搜索完成的广播
- filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
- // 注册广播
- registerReceiver(receiver, filter);
搜索蓝牙的方法
- private void scanBluth() {
- // 设置进度条
- setProgressBarIndeterminateVisibility(true);
- setTitle("正在搜索...");
- // 判断是否在搜索,如果在搜索,就取消搜索
- if (mBluetoothAdapter.isDiscovering()) {
- mBluetoothAdapter.cancelDiscovery();
- }
- // 开始搜索
- mBluetoothAdapter.startDiscovery();
- }
广播接收器
- private final BroadcastReceiver receiver = 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);
- String aa = tvDevices.getText().toString() + "";
- if (aa.contains(device.getAddress())) {
- return;
- } else {
- // 判断是否配对过
- if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
- // 添加到列表
- short rssi = intent.getExtras().getShort(
- BluetoothDevice.EXTRA_RSSI);
- int iRssi = abs(rssi);
- // 将蓝牙信号强度换算为距离
- double power = (iRssi - 59) / 25.0;
- String mm = new Formatter().format("%.2f", pow(10, power)).toString();
- tvDevices.append(device.getName() + ":"
- + device.getAddress() + " :" + mm + "m" + "\n");
- }else {
- }
- }
- // 搜索完成
- } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
- .equals(action)) {
- // 关闭进度条
- setProgressBarIndeterminateVisibility(true);
- setTitle("搜索完成!");
- mBLHandler.sendEmptyMessageDelayed(1, 1000);
- }
- }
- };
代码里我添加了循环扫描的Handler
- // 用于循环扫描蓝牙的hangdler
- Handler mBLHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case 1:
- scanBluth();
- break;
- default:
- break;
- }
- }
- };
项目里用到前期写的一个权限管理器,具体去前边看,地址:
//www.jb51.net/article/133350.htm
用到的权限为
- //所有手机需要的权限,蓝牙功能才能正常使用
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- //部分手机(如小米等)需要将下面两个权限添加进去,蓝牙功能才能正常使用
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />