【问题标题】:Discover bluetooth device and append to TableLayout发现蓝牙设备并附加到 TableLayout
【发布时间】:2021-09-10 12:30:54
【问题描述】:

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

基本上,我正在尝试启动发现并将 deviceName 和 rssi 打印到表格布局。

这是我的代码:

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);
    }
}

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

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


编辑:

我在onReceive 中添加了Log.d("PBK_Test - Detected", deviceName + "_" + rssi);,但它也没有显示出来。

【问题讨论】:

  • 为什么不尝试使用交错布局管理器的 recyclerview。获取蓝牙设备将此设备添加到列表并将该列表传递给 recylerview 适配器。下面是链接,例如github.com/thoughtbot/expandable-recycler-view
  • @Raza 谢谢你的建议。我知道这里的 UI 会有更好的方法,但是 appendTabletableLayout 在本课程的其他部分工作得很好。我也试过appendTable(findViewById(R.id.tableBLE), "DebugDevice" + "_" + "DebugRSSI");,它按预期工作。您的意思是在onReceive 中使用带有表格布局的appendTable 是结果未显示的原因吗?

标签: android bluetooth android-bluetooth


【解决方案1】:

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

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

【讨论】:

  • 因为这个类的其他部分需要并发。正如你所建议的,我写了一个新的appendTableappendTableFront(见编辑),没有runOnUiThread(),结果仍然没有显示。
【解决方案2】:

我自己想通了。

问题不在代码中--

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

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

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2017-03-17
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多