蓝牙配对

权限

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

 

使用蓝牙要用到官方的蓝牙适配器  android.bluetooth.BluetoothAdapter   和广播

 

先判断手机是否支持蓝牙

private void initBluetooth() {
        bluetoothAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            Toast.makeText(BlueActivity.this, "设备不支持蓝牙", Toast.LENGTH_LONG).show();
        }
    }

 

 

广播

    private BroadcastReceiver bluetoothreceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()){
                case BluetoothDevice.ACTION_FOUND:
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Logger.e("ACTION_FOUND " + device.toString());
                    //adapter.add(device);
                    break;

                case android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_STARTED:
                    Logger.e("开始扫描");
                    break;
                case android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
                    Logger.e("扫描结束");
                    break;
            }

        }
    };

 

注册接受者   onDestroy时要注销

    private void initReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_FOUND);
        filter.addAction(android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        filter.addAction(android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(bluetoothreceiver, filter);
    }

 

开启关闭蓝牙,扫描停止。

 

    public void bluetooth(View view) {
        switch (view.getId()) {
            case R.id.btn_open_bluetooth:
                if (!bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.enable();
                }
                break;

            case R.id.btn_close_bluetooth:
                if (bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.disable();
                }
                break;

            case R.id.btn_scan:
                bluetoothAdapter.startDiscovery();
                break;

            case R.id.btn_stop_scan:
                bluetoothAdapter.cancelDiscovery();
                break;
        }
    }

 

 

 

如果想用list显示 扫描出来的设备,实体可以用官方的 BluetoothDevice

通过这个device 可以获取很多属性

getBondState   返回10 代表没有配对   12 代表已经配对  11代表配对中

getAddress    代表蓝牙地址  有的手机mac地址和蓝牙非常相似,只有几个字符不同

getName   可以手机的名字 这个可以在设置里面修改

getTpye   获取对方设备支持的蓝牙协议  通常都是 返回1

    public static final int DEVICE_TYPE_CLASSIC = 1;
    public static final int DEVICE_TYPE_DUAL = 3;
    public static final int DEVICE_TYPE_LE = 2;
    public static final int DEVICE_TYPE_UNKNOWN = 0;

 

getUuids    这里有一个s,说明肯定不止一个,至于为什么 我也不知道

值得注意的是  如果没有进行配对,用这个方法只会得到一个null,而只有配对之后再调用这个方法才会得到 一个 ParcelUuid[] 对象

经过测试 发现一部手机是8个 一部手机是10个 

其中一个的uuid    

0000112d-0000-1000-8000-00805f9b34fb

除了红色部分会变化,其他地方都不会改变,两部手机肯定也会出现同样的uuid的情况,到底用来干啥的,暂时不清楚

输出 每个uuid的方法

Parcelable[] uuidExtra = device.getUuids();
for (int i=0; i<uuidExtra.length; i++) {
      String uuid = uuidExtra[i].toString();
    }

 

在广播 中接受到 BluetoothDevice.ACTION_FOUND 时,可以获取搜索到的设备

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

如果想加载到list上  可以用list的适配器add

 

现在list上显示了搜索出来的设备,如果想通过点击来配对目标设备

 

在安卓4.4  Api 19之后,配对起来很简单   

device.createBond();

 此时双方手机界面会显示

 

 

 

但是Api 19之前是不能用这个方法的,系统隐藏了,不过可以用反射

                            try {
                                Method createBondMethod  = BluetoothDevice.class.getMethod("createBond");
                                createBondMethod.invoke(device);
                            } catch (NoSuchMethodException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            }

 

posted @ 2016-11-10 17:53  demon9  阅读(499)  评论(0编辑  收藏  举报