通过 Android Studio 发送蓝牙消息

时间:2021-03-23 12:55:21

标签: java android bluetooth message

我正在尝试在 Android Studio 中通过蓝牙发送消息。我用谷歌搜索,但我找不到答案。我想向连接的设备发送消息。

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
    private ImageView bluetoothOnImageView;
    private ImageView bluetoothOffImageView;
    private TextView bluetoothOnOffTextView;
    private BluetoothAdapter bluetoothAdapter;
    private ListView listView;
    private EditText messageEditText;
    private ArrayList<String> deviceList = new ArrayList<String>();
    private ArrayList<BluetoothDevice> deviceListBluetooth = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bluetoothOnImageView = findViewById(R.id.bluetoothOnImageView);
        bluetoothOffImageView = findViewById(R.id.bluetoothOffImageView);
        bluetoothOnOffTextView = findViewById(R.id.bluetoothOnOffTextView);
        listView = findViewById(R.id.listView);
        messageEditText = findViewById(R.id.messageEditText);

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter.startDiscovery();
        checkBluetooth();

        Toast.makeText(this, "Scanning devices...", Toast.LENGTH_SHORT).show();
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);

        IntentFilter filterChange = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        registerReceiver(receiverChange, filter);

        listView.setOnItemClickListener(MainActivity.this);
    }

    private final BroadcastReceiver receiverChange = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                // 3 Cases
                // 1: Bonded already
                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                    Log.d("BroadcastReceiver", "BOND_BONDED");
                    Toast.makeText(MainActivity.this, "Already connected to this device.", Toast.LENGTH_SHORT).show();
                }
                // 2: Creating a bond
                if (device.getBondState() == BluetoothDevice.BOND_BONDING) {
                    Log.d("BroadcastReceiver", "BOND_BONDING");
                }
                // 3: Breaking a bond
                if (device.getBondState() == BluetoothDevice.BOND_NONE) {
                    Log.d("BroadcastReceiver", "BOND_NONE");
                    Toast.makeText(MainActivity.this, "Broke connection to this device.", Toast.LENGTH_SHORT).show();
                }
            }
        }
    };

    public void bluetoothSearchOnClick(View view) {
        Toast.makeText(this, "Rescanning devices...", Toast.LENGTH_SHORT).show();

        // Reset devices
        deviceList.clear();
        deviceListBluetooth.clear();

        bluetoothAdapter.startDiscovery();
        checkBluetooth();

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);
        unregisterReceiver(receiverChange);
        super.onDestroy();
    }

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                String newDevice = device.getName() + "\n" + device.getAddress();
                boolean duplicate = false;

                // No duplicate devices
                for (int i = 0; i < deviceList.size(); i++) {
                    if (newDevice.equals(deviceList.get(i))) {
                        duplicate = true;
                    }
                }

                if (!duplicate) {
                    deviceList.add(newDevice);
                    deviceListBluetooth.add(device);
                }

                Log.i("BT", device.getName() + "\n" + device.getAddress());
                listView.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, deviceList));
            }
        }
    };

    public void bluetoothOnOnClick(View view) {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter.disable();

        // Wait x milliseconds
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                checkBluetooth();
            }
        }, 500);
    }

    public void bluetoothOffOnClick(View view) {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter.enable();

        // Wait x milliseconds
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                checkBluetooth();
            }
        }, 500);
    }

    private void checkBluetooth() {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        if (bluetoothAdapter == null) {
            // Device does not support Bluetooth
            Toast.makeText(this, "This device does not support Bluetooth", Toast.LENGTH_SHORT).show();
        } else if (!bluetoothAdapter.isEnabled()) {
            // Bluetooth is not enabled :)
            bluetoothOnImageView.setVisibility(View.GONE);
            bluetoothOffImageView.setVisibility(View.VISIBLE);

            bluetoothOnOffTextView.setText("OFF");
            bluetoothOnOffTextView.setTextColor(Color.RED);
        } else {
            // Bluetooth is enabled
            bluetoothOffImageView.setVisibility(View.GONE);
            bluetoothOnImageView.setVisibility(View.VISIBLE);

            bluetoothOnOffTextView.setText("ON");
            bluetoothOnOffTextView.setTextColor(Color.GREEN);
        }
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        checkBluetooth();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        bluetoothAdapter.cancelDiscovery();

        Log.d("Bluetooth Adapter", "onItemClick: You Clicked on a device.");
        String[] device = deviceList.get(position).split("\n");
        String deviceName = device[0];

        // Bond
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
            Log.d("Bluetooth Adapter", "Trying to pair with " + deviceName);
            deviceListBluetooth.get(position).createBond();
        }
    }

    public void sendButtonOnClick(View view) {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        // Send message
    }
}

在 sendButtonOnClick(View view) 方法中,我想发送消息。你可以在代码底部找到这个方法。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

这并不像您想象的那么简单(将消息传递功能打包到一种方法中)。您需要使用 BluetoothSocket 连接到从 BluetoothDevice 获得的 createRfcommSocketToServiceRecord 并知道“消息传递”UUID(您可以使用 getUuids() 方法列出它们)。在正确的套接字连接后,您可以获得输入和输出流(getInputStreamgetOutputStream),如果需要,您可以从中将 readwrite 字节转换为文本。在 HERE 中发现了相当不错的示例,它使用分离的 Thread 进行蓝牙通信,使整个功能异步并且不挂起主/UI 线程

相关问题