发现蓝牙设备并附加到 TableLayout

Discover bluetooth device and append to TableLayout

我正在尝试发现蓝牙设备并将结果附加到 TableLayout。

基本上,我正在尝试开始发现并将 deviceName 和 rssi 打印到 table 布局。

这是我的代码:

public class DatabaseActivity extends AppCompatActivity {
    public BluetoothAdapter bluetoothAdapter;

    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 deviceName = device.getName(); 
                String deviceHardwareAddress = device.getAddress(); 
                int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE); 

                // Append to tableBLE
                TableLayout tl = findViewById(R.id.tableBLE);
                appendTableFront(tl, deviceName + "_" + rssi);

                Log.d("PBK_Test - Detected", deviceName + "_" + rssi);
            }
        }
    };

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

        // Bluetooth
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            // Device doesn't support Bluetooth
        }
        if (!bluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, 0);
        }

        // Start Discovery
        bluetoothAdapter.startDiscovery();

        // Register for broadcasts when a device is discovered.
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);

        // Make discoverable
        if (bluetoothAdapter.getScanMode() !=
                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
        }
    }

    public void appendTableFront(TableLayout tl, String msg) {
        TableRow newRow = new TableRow(this);
        newRow.setBackgroundColor(Color.GRAY);
        newRow.setLayoutParams(new TableRow.LayoutParams(
                TableRow.LayoutParams.MATCH_PARENT,
                TableRow.LayoutParams.WRAP_CONTENT));

        TextView label_id = new TextView(this);
        label_id.setText(msg);
        label_id.setTextColor(Color.WHITE);
        label_id.setPadding(5, 5, 5, 5);
        newRow.addView(label_id);

        tl.addView(newRow);
    }
}

我可以被发现,但检测不到其他设备。

我尝试了内置的蓝牙发现,它工作正常。


编辑:

我将 Log.d("PBK_Test - Detected", deviceName + "_" + rssi); 添加到 onReceive,但它也没有显示。

newRow 可能是 null,因为没有 final 关键字并且您更改了范围。

删除这条指令:runOnUiThread() ...因为它不在后台运行。

我自己想出来了。

问题不在代码中--

您必须进入设置 -> 应用程序 -> -> 权限,以手动授予您的应用程序权限,即使您已在 MANIFEST 中声明它们。

引用: 这个视频https://www.youtube.com/watch?v=dLZDJgblgj8