android获取附近蓝牙设备并计算距离的实例代码

需要用到本地蓝牙适配器

 
  1. // 获取本地蓝牙适配器
  2. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

判断是否支持蓝牙,并确认打开该功能。

 
  1. // 判断手机是否支持蓝牙
  2. if (mBluetoothAdapter == null) {
  3. Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
  4. finish();
  5. }
  6. // 判断是否打开蓝牙
  7. if (!mBluetoothAdapter.isEnabled()) {
  8. // 弹出对话框提示用户是后打开
  9. Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  10. startActivityForResult(intent, 1);
  11. // 不做提示,强行打开
  12. // mBluetoothAdapter.enable();
  13. }else {
  14. // 不做提示,强行打开
  15. mBluetoothAdapter.enable();
  16. }

获取手机已经配对的蓝牙设备

 
  1. // 获取已经配对的设备
  2. Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
  3. .getBondedDevices();
  4. // 判断是否有配对过的设备
  5. if (pairedDevices.size() > 0) {
  6. for (BluetoothDevice device : pairedDevices) {
  7. // 遍历
  8. mDevicesList.add(device.getAddress());
  9. tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");
  10. }
  11. }

注册异步搜索蓝牙设备的广播

 
  1. // 找到设备的广播
  2. IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  3. // 注册广播
  4. registerReceiver(receiver, filter);
  5. // 搜索完成的广播
  6. filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  7. // 注册广播
  8. registerReceiver(receiver, filter);

搜索蓝牙的方法

 
  1. private void scanBluth() {
  2. // 设置进度条
  3. setProgressBarIndeterminateVisibility(true);
  4. setTitle("正在搜索...");
  5. // 判断是否在搜索,如果在搜索,就取消搜索
  6. if (mBluetoothAdapter.isDiscovering()) {
  7. mBluetoothAdapter.cancelDiscovery();
  8. }
  9. // 开始搜索
  10. mBluetoothAdapter.startDiscovery();
  11. }

广播接收器

 
  1. private final BroadcastReceiver receiver = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. // 收到的广播类型
  5. String action = intent.getAction();
  6. // 发现设备的广播
  7. if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  8. // 从intent中获取设备
  9. BluetoothDevice device = intent
  10. .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  11. String aa = tvDevices.getText().toString() + "";
  12. if (aa.contains(device.getAddress())) {
  13. return;
  14. } else {
  15. // 判断是否配对过
  16. if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
  17. // 添加到列表
  18. short rssi = intent.getExtras().getShort(
  19. BluetoothDevice.EXTRA_RSSI);
  20. int iRssi = abs(rssi);
  21. // 将蓝牙信号强度换算为距离
  22. double power = (iRssi - 59) / 25.0;
  23. String mm = new Formatter().format("%.2f", pow(10, power)).toString();
  24. tvDevices.append(device.getName() + ":"
  25. + device.getAddress() + " :" + mm + "m" + "\n");
  26. }else {
  27. }
  28. }
  29. // 搜索完成
  30. } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
  31. .equals(action)) {
  32. // 关闭进度条
  33. setProgressBarIndeterminateVisibility(true);
  34. setTitle("搜索完成!");
  35. mBLHandler.sendEmptyMessageDelayed(1, 1000);
  36. }
  37. }
  38. };

代码里我添加了循环扫描的Handler

 
  1. // 用于循环扫描蓝牙的hangdler
  2. Handler mBLHandler = new Handler() {
  3. @Override
  4. public void handleMessage(Message msg) {
  5. super.handleMessage(msg);
  6. switch (msg.what) {
  7. case 1:
  8. scanBluth();
  9. break;
  10. default:
  11. break;
  12. }
  13. }
  14. };

项目里用到前期写的一个权限管理器,具体去前边看,地址:

//www.jb51.net/article/133350.htm

用到的权限为

 
  1. //所有手机需要的权限,蓝牙功能才能正常使用
  2. <uses-permission android:name="android.permission.BLUETOOTH" />
  3. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  4. //部分手机(如小米等)需要将下面两个权限添加进去,蓝牙功能才能正常使用
  5. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  6. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值