Android12 (sdk33) y superiores integran la aplicación Bluetooth

módulo bluetooth

Declarar permisos de Bluetooth

Si desea que su aplicación inicie el descubrimiento de dispositivos o manipule la configuración de Bluetooth, BLUETOOTHdebe declarar BLUETOOTH_ADMINpermisos además de los permisos. La mayoría de las aplicaciones sólo necesitan este permiso para descubrir dispositivos Bluetooth locales.

Agregue los siguientes permisos en el archivo AndroidManifest.xml

  	<!-- 安卓12之前的蓝牙权限需求-->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- 安卓12新增的蓝牙权限-->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <!-- 定位权限, 蓝牙搜索需要-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Configurar Bluetooth

1. Obtenga el adaptador Bluetooth

Requerido por todas las actividades Bluetooth BluetoothAdapter. Para obtenerlo , llame al método BluetoothAdapterestático . getDefaultAdapter()Este método devuelve un BluetoothAdapterobjeto que representa el propio adaptador Bluetooth del dispositivo (dispositivo inalámbrico Bluetooth). Solo hay un adaptador Bluetooth para todo el sistema y su aplicación puede interactuar con él mediante este objeto. Si getDefaultAdapter()se devuelve null, el dispositivo no es compatible con Bluetooth.

 	/**
     * 获取BluetoothAdapter对象,并判断蓝牙是否获取到
     */
    public boolean isBlueToothAvailable() {
    
    
        //获取BluetoothAdapter对象
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // 判断蓝牙是否可用
        return bluetoothAdapter != null;
    }
2. Habilite Bluetooth

A continuación, debe asegurarse de que Bluetooth esté habilitado. Llamado isEnabled()para verificar si Bluetooth está actualmente habilitado. Si este método devuelve falso, significa que Bluetooth está deshabilitado. Para solicitar que se habilite Bluetooth, llame a startActivityForResult(), pasando una ACTION_REQUEST_ENABLEoperación de intención. Esta llamada realiza una solicitud para habilitar Bluetooth a través de la configuración del sistema (sin detener la aplicación)

 	/**
     * 启用蓝牙
     *
     * @param activity 启动该方法的Activity
     */
    public void openBlueTooth(Activity activity) {
    
    
        if (!bluetoothAdapter.isEnabled()) {
    
    
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            activity.startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        } else {
    
    
            Toast.makeText(activity, "蓝牙已打开", Toast.LENGTH_SHORT).show();
        }
    }

encontrar dispositivo

1. Consultar dispositivos emparejados

Antes de realizar la detección de dispositivos, debe consultar el conjunto de dispositivos emparejados para ver si el dispositivo deseado está en el estado Detectado. Para hacer esto, llame al getBondedDevices(). Este método devuelve una matriz de BluetoothDeviceobjetos que representan dispositivos emparejados. Por ejemplo, puede consultar todos los dispositivos emparejados y obtener el nombre y la dirección MAC de cada dispositivo.

 	/**
     * 打印已配对设备
     */
    public void printDevice() {
    
    
        //打印出已配对的设备
        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
        if (pairedDevices.size() > 0) {
    
    
            for (BluetoothDevice device : pairedDevices) {
    
    
                listAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        } else {
    
    
            listAdapter.add("没有已配对设备");
        }
    }
2. Descubre el dispositivo
 	/**
     * 广播接收者
     * 接收发现蓝牙设备和蓝牙设备扫描结束的广播
     */
    private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
    
            String action = intent.getAction();//获取蓝牙设备
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
    
      //发现设备
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                assert device != null;
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
    
      //如果设备未绑定
                    listAdapter.add(device.getName() + "\n" + device.getAddress());
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
    
      //扫描设备结束
                if (listAdapter.getCount() == 0) {
    
      //没有设备
                    Toast.makeText(BluetoothDeviceListActivity.this, "没有设备",
                            Toast.LENGTH_SHORT).show();
                }
            }
        }
    };

    @Override
    public void setRequestedOrientation(int requestedOrientation) {
    
    
        super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        //注册广播
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(bluetoothReceiver, filter);

        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        this.registerReceiver(bluetoothReceiver, filter);

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        listAdapter = new ArrayAdapter<>(this, R.layout.device_name);
        ListView lv_device = findViewById(R.id.listView);
        Button bt_find = findViewById(R.id.bt_find);
        lv_device.setAdapter(listAdapter);

        printDevice();

        bt_find.setOnClickListener(new OnClickListener() {
    
    
            @Override
            public void onClick(View arg0) {
    
    
                bluetoothAdapter.startDiscovery();   //开始扫描
            }
        });

        //选择连接设备
        lv_device.setOnItemClickListener(new OnItemClickListener() {
    
    
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                                    long arg3) {
    
    
                String info = ((TextView) v).getText().toString();
                if (info.equals("没有已配对设备")) {
    
    
                    Toast.makeText(getApplicationContext(), "没有已配对设备", Toast.LENGTH_LONG)
                            .show();
                } else {
    
    
                    String address = info.substring(info.length() - 17);   //获取蓝牙设备地址

                    Intent intent = new Intent();
                    intent.putExtra(EXTRA_DEVICE_ADDRESS, address);   //将地址装入EXTRA_DEVICE_ADDRESS
                    setResult(Activity.RESULT_OK, intent); //将地址传送回MainActivity
                    finish();
                }
            }
        });

    }

conectar

1. Conecte el dispositivo
    /**
     * 连接设备
     * @param device 蓝牙设备
     * @return 连接状态
     */
    public boolean connectThread(BluetoothDevice device) {
    
    
        try {
    
    
            bluetoothSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            bluetoothAdapter.cancelDiscovery();
            bluetoothSocket.connect();
            connectStatus = true;  //连接成功
            // 接收数据进程
            new Thread(new Runnable() {
    
      //读线程
                @Override
                public void run() {
    
    
                    int bytes;
                    byte[] buffer = new byte[256];
                    while (true) {
    
    
                        if (bluetoothSocket != null && bluetoothSocket.isConnected()) {
    
    
                            try {
    
     // 接收数据
                                bytes = bluetoothSocket.getInputStream().read(buffer);
                                final String readStr = new String(buffer, 0, bytes); //读出的数据
                            } catch (IOException e) {
    
    
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
        } catch (IOException e) {
    
    
            connectStatus = false;  //连接失败
            try {
    
    
                bluetoothSocket.close();
            } catch (IOException e2) {
    
    
                e.printStackTrace();
            }
        }
        return connectStatus;
    }
2. Cancelar la conexión
 /**
     * 取消连接
     */
    public void cancelConnect() {
    
    
        try {
    
    
            bluetoothSocket.close();
            connectStatus = false;
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

transmisión de datos

1. Azul envía datos
 /**
     * 蓝牙发送数据
     *
     * @param str 待发送的字符串
     */
    public void write(String str) {
    
    
        if (connectStatus) {
    
    
            byte[] buffer = str.getBytes();
            try {
    
    
                bluetoothSocket.getOutputStream().write(buffer);
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

Resultados de la prueba de transmisión Bluetooth

Preste atención a los peligros de la versión 33 del SDK

  • Android 12 y versiones posteriores requieren una aplicación de permiso dinámico; de lo contrario, se informará un error y se bloqueará al recuperar el dispositivo Bluetooth conectado.
  • El código se informará en rojo. Solo necesita configurar la aplicación de permiso dinámico antes de llamar a Bluetooth y podrá usarlo. Debería haber una mejor solución por resolver...
1. Primero mire el directorio de archivos.

Por favor agregue la descripción de la imagen.

  • BluetoothUtils Algunos métodos de configuración inicial de Bluetooth
  • BluetoothDeviceListActivity Visualización de la lista de conexiones Bluetooth
  • Página de inicio de actividad principal
  • Debajo del diseño se encuentra la interfaz de usuario.
2. Método de prueba
1. Utilice su teléfono móvil para conectarse al Bluetooth de la computadora portátil y abra un puerto de comunicación entrante de la siguiente manera

Por favor agregue la descripción de la imagen.

2. Abra la herramienta de depuración del puerto serie, seleccione el número de puerto, por ejemplo, el mío es el puerto COM6, y luego abra el puerto serie

Por favor agregue la descripción de la imagen.

3. Compile e instale el programa Android en su teléfono, haga clic en Conectar Bluetooth a la izquierda y seleccione el dispositivo Bluetooth de su computadora a la derecha.

Por favor agregue la descripción de la imagen.

4. Haga clic en el botón Enviar para ver el efecto en la herramienta de depuración.

Por favor agregue la descripción de la imagen.

expandir

Cuando implementemos con éxito la transmisión de datos Bluetooth en el lado de Android, podremos integrar el hardware para implementar algunas funciones.

  • El coche Bluetooth controla el movimiento del coche enviando instrucciones.
  • Las casas inteligentes, como el control de encendido y apagado de luces, aires acondicionados, cortinas, etc., por supuesto, solo se pueden reproducir con microcontroladores y aún están lejos de su uso real.

Para una introducción detallada, consulte la documentación oficial: Descripción general de Bluetooth | Desarrolladores de Android | Desarrolladores de Android (google.cn)

Repositorio de código completo: https://gitee.com/chafaner

Supongo que te gusta

Origin blog.csdn.net/weixin_45833112/article/details/129799278
Recomendado
Clasificación