Android 上的蓝牙:调试 startDiscovery()

问题描述 投票:0回答:1

我正在开发一个应用程序,用于搜索可发现的设备并将它们显示为按钮。 当调用

startDiscovery()
时,根据我当前使用
BroadcastReceiver
ACTION_DISCOVERY_FINISHED
进行调试的方式,我会说它在 30% 的时间内有效。

我还使用

isDiscovering()
来测试
startDiscovery()
函数是否被调用但返回 false。

有没有办法知道

startDiscovery()
是否调用成功?你能在我的代码中找出一些不会失败的东西吗?

观察:我同时拥有

BLUETOOTH
BLUETOOTH_ADMIN
权限。

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan);

        mReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                String Address;
                // When discovery finds a device
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    // Get the BluetoothDevice object from the Intent
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Address = device.getAddress();
                    System.out.println("Found Address: " + Address );  //DEBUG
                            //Do something with Address
                } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                    System.out.println("Discovery finished");
                }
            }
        };

        // Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(mReceiver, filter);    

        MainActivity.mBluetoothAdapter.startDiscovery();

        if (MainActivity.mBluetoothAdapter.isDiscovering()) {
            System.out.println("Discovering...");  //DEBUG
        }

}

虽然我有一些可发现的设备可用,但它们都不会触发

onReceive()
ACTION_FOUND

更新:应用程序运行时,我进入“蓝牙设置”下的“扫描”,但无法扫描新设备。我禁用/启用蓝牙并返回应用程序,问题得到解决。我不知道这是否表明适配器正忙或以某种方式停止。

android bluetooth bluetooth-device-discovery
1个回答
1
投票

我确认了这个问题。

在某些手机上,您只需禁用/激活 BT。您可以通过编程来完成

mBluetoothAdapter.disable(); 
mBluetoothAdapter.enable();

在某些手机上这还不够(三星 S5)。为了检测它,我使用计时器,如果在超时结束时未收到 BT 广播状态的更改(BluetoothAdapter.ACTION_DISCOVERY_STARTED 或 BluetoothAdapter.ACTION_DISCOVERY_FINISHED )=> 则表明 BT 未工作。实际上我显示了建议用户重新启动电话的对话框。

© www.soinside.com 2019 - 2024. All rights reserved.