Advertisement

Android蓝牙开发BLE-蓝牙连接

阅读量:

刚开始接触蓝牙,很多不明白不清楚,决定写点东西记录下。

1.权限
复制代码
    	<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

其中ACCESS_FINE_LOCATION这个权限是危险权限,需要动态获取的。

2.扫描蓝牙
扫描

直接撸代码

复制代码
    	ArrayList<BluetoothDevice> list_device=new ArrayList<>(); //蓝牙设备
    Handler mHandler=new Handler();
    BluetoothAdapter mAdapter;
    int time=20000;  //蓝牙扫描时长
    ListView mListView;
    public  void scan() {
        BluetoothManager bluetoothManager= (BluetoothManager)getSystemService(BLUETOOTH_SERVICE);
        mAdapter=bluetoothManager.getAdapter();   //获取蓝牙适配器
        if (!mAdapter.isEnabled()){               //如果蓝牙未打开,打开蓝牙
            Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(intent);
        }
        final BluetoothLeScanner scanner=mAdapter.getBluetoothLeScanner();  //获取BluetoothLeScanner对象
        scanner.startScan(callback);   //开始扫描,扫描的结果在callback里面处理
        mHandler.postDelayed(new Runnable() {  //20秒后停止扫描,在callback里获取扫描结果
            @Override
            public void run() {
                scanner.stopScan(callback);
            }
        },time);
    }

蓝牙扫描,在蓝牙技术中特别重要的回调类通常是ScanCallback。它实现了两个核心功能,并且我不太清楚第三个功能有什么作用!

复制代码
    ScanCallback callback=new ScanCallback() {   //扫描回调
        @Override
        public void onScanResult(int callbackType, ScanResult result) {   //找到设备                
        	super.onScanResult(callbackType,result);
        	//在这里面对你扫描到的蓝牙设备进行操作
        	//我的代码(写的不好,多指正)
        	 ScanRecord scanRecord = result.getScanRecord();  //获取扫描记录
            if ((result.getDevice().getName()+"l").length()>5&&list_device.indexOf(result.getDevice())==-1){   //加入到list中
                list_device.add(result.getDevice());
            }
            Log.d(TAG, "onScanResult: "+list_device.size());
            String[] btName=new String[list_device.size()];
            for (int i = 0; i <list_device.size() ; i++) {
                btName[i]=list_device.get(i).getName();
            }
            ArrayAdapter<String> adapter=new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,btName);
            mListView.setAdapter(adapter);
        }
        @Override
        public void onScanFailed(int errorCode) {                //没有开启扫描
            super.onScanFailed(errorCode);
        }
    };

在该if语句体内有两个判断条件:其一是当我在操作过程中遇到了许多未命名的蓝牙设备,并不知情的情况下便进行了长度校验;其二是为了避免添加重复的蓝牙设备而设置了相应的限制措施。

连接蓝牙

例如在我的设备中

复制代码
      mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                BluetoothDevice bluetoothDevice = list_device.get(i);
                bluetoothDevice.connectGatt(MainActivity.this,true,mBluetoothGattCallback);
            }
        });

connectGatt方法包含三个关键配置项:第一个用于传递上下文信息;第二个布尔类型设置决定了后续操作流程的方向;第三个配置项指定了完成操作后应触发的动作。

复制代码
      BluetoothGattCallback mBluetoothGattCallback=new BluetoothGattCallback() {        //连接回调
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            if (status==BluetoothGatt.GATT_SUCCESS) {
                Log.d(TAG, "onConnectionStateChange: ========》》连接成功");
            }
        }
    };

看来已经接近成功了

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~