欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android蓝牙开发BLE-蓝牙连接

程序员文章站 2024-03-24 23:58:04
...

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

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语句中,第一个判断是我在操作的时候有很多没有名字的蓝牙,我也不知道咋回事,就加个长度判断,第二个是不加入重复的蓝牙设备。

连接蓝牙

以我的为例,我把扫描到的蓝牙设备放入了集合,然后获取设备名显示在listview上。给listview添加一个监听事件,单击就连接蓝牙即可。

  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方法有三个参数,第一个context,第二个Boolean值,是否自动连接,第三个是回调函数

  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: ========》》连接成功");
            }
        }
    };

到这应该就是成功了吧,我也不确定,等我写下一篇收发的时候就知道了。哈哈
Android蓝牙开发BLE-蓝牙连接

相关标签: BLE