android 19以上 蓝牙连接过程及注意点

蓝牙开启检测
/**
     * 检查蓝牙是否可用
     * @param context
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    private void checkBleDevice(Context context){
        bluetoothManager= (BluetoothManager) this.getSystemService(BLUETOOTH_SERVICE);
        adapter=bluetoothManager.getAdapter();
        msg2.setText("已经获得管理器");
        if (adapter!=null){
            if (!adapter.isEnabled()){
                Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  //一下三行是打开蓝牙勾选界面
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                msg1.setText("需要打开蓝牙");
            }else {
                msg1.setText("蓝牙可用");
            }
        }else {
            Toast.makeText(context,"该设备不支持蓝牙",Toast.LENGTH_LONG).show();
            msg1.setText("不支持蓝牙");
        }
    }

 蓝牙获取已配对设备

/**
     * 获取配对设备
     */
    private void getBondDevice(){
        pairedDevices=adapter.getBondedDevices();
        if (pairedDevices==null){
            return;
        }
        StringBuilder sb=new StringBuilder();
        for (BluetoothDevice device:pairedDevices){
            String name=device.getName();
            String address=device.getAddress();
            sb.append("名称:");
            sb.append(name);
            sb.append("  地址:");
            sb.append(address);
            sb.append("\n");
        }
        listleft.setText(sb.toString());
    }


开启蓝牙页面搜索

 /**
     * 获得管理权限
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    private void startDiscover(){
        if (adapter.startDiscovery()){
            list.setText("开始扫描");
        }else {
            list.setText("启动失败");
        }
    }


注册接收蓝牙的BroadCastReceiver

/**
 * @author:yuzhetao
 * @date:2018/7/10
 * @usage:
 */
public class BluetoothReceiver extends BroadcastReceiver {


    public BluetoothReceiver() {

    }

    RegisterBltReceiver onRegisterBltReceiver;

    public BluetoothReceiver(RegisterBltReceiver onRegisterBltReceiver) {
        this.onRegisterBltReceiver = onRegisterBltReceiver;
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Bundle b = intent.getExtras();
        Object[] lstName = b.keySet().toArray();

        // 显示所有收到的消息及其细节
        for (int i = 0; i < lstName.length; i++) {
            String keyName = lstName[i].toString();
            Log.i("bluetooth", keyName + ">>>" + String.valueOf(b.get(keyName)));
        }
        final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        if (!"BC:E6:3F:74:B9:95".equals(device.getAddress())) {
            return;
        }
        // 搜索发现设备时,取得设备的信息;注意,这里有可能重复搜索同一设备
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            onRegisterBltReceiver.onBltFound(device);
            if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                if (!device.createBond()) {
                    onRegisterBltReceiver.onBltNone(device);
                }
            } else {
                onRegisterBltReceiver.onBltEnd(device);
                connectDevive(device, new Callback() {
                    @Override
                    public void connected() {
                        onRegisterBltReceiver.onBltConneted(device);
                    }
                });
            }
        }
        //状态改变时
        else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            switch (device.getBondState()) {
                case BluetoothDevice.BOND_BONDING://正在配对
                    Log.d("BlueToothTestActivity", "正在配对......");
                    onRegisterBltReceiver.onBltStart(device);
                    break;
                case BluetoothDevice.BOND_BONDED://配对结束
                    Log.d("BlueToothTestActivity", "完成配对");
                    onRegisterBltReceiver.onBltEnd(device);
                    connectDevive(device, new Callback() {
                        @Override
                        public void connected() {
                            onRegisterBltReceiver.onBltConneted(device);
                        }
                    });
                    break;
                case BluetoothDevice.BOND_NONE://取消配对/未配对
                    Log.d("BlueToothTestActivity", "取消配对");
                    onRegisterBltReceiver.onBltNone(device);
                default:
                    break;
            }
        }
    }

    interface Callback {
        void connected();
    }

    private void connectDevive(final BluetoothDevice device, final Callback callback) {
        BackgroundExecutor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    UUID uuid=device.getUuids()[0].getUuid();
                    BluetoothSocket socket=device.createRfcommSocketToServiceRecord(uuid);
                    int i=0;
                    while (!connectSocket(socket)||i>=device.getUuids().length){
                        i++;
                        socket=device.createInsecureRfcommSocketToServiceRecord(device.getUuids()[i].getUuid());
                    }
                    if (socket.getInputStream() != null) {
                        UiThreadExecutor.runTask("", new Runnable() {
                            @Override
                            public void run() {
                                callback.connected();
                            }
                        }, 0L);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**如果失败返回false
    **/
    private boolean connectSocket(BluetoothSocket socket) {
        try {
            socket.connect();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

}

注意 在之前已经配对过的设备,将不会有正在配对的状态,

直接会收到配对完成


其次配对完成之后,需要向配对设备发送数据

这其中需要多次尝试设备的历史UUID

比如

                    UUID uuid=device.getUuids()[0].getUuid();
                    BluetoothSocket socket=device.createRfcommSocketToServiceRecord(uuid);
                    int i=0;
                    while (!connectSocket(socket)||i>=device.getUuids().length){
                        i++;
                        socket=device.createInsecureRfcommSocketToServiceRecord(device.getUuids()[i].getUuid());
                    }

连接有可能失败会出现java.io.IOException: read failed, socket might closed or timeout, read ret: -1

要不断循环连接 直到尝试成功


目标设备

连接详情


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值