简体   繁体   English

Android Bluetooth BroadcastReceiver无法发现设备

[英]Android Bluetooth BroadcastReceiver not discovering devices

I have combed the forums in order to try and figure out why my bluetooth BroadcastReceiver isn't working and all I can find is people saying to ensure that coarse/fine location permissions are requested. 我梳理了论坛,以试图弄清为什么我的蓝牙BroadcastReceiver无法正常工作,而我能找到的就是有人说要确保请求粗略/精细的位置权限。 I'm already doing that here (method is called before the discovery method): 我已经在这里做了(方法在发现方法之前被调用):

Request Permissions 请求权限

private void requestPermissions()
{
    final int CODE = 5; // app defined constant used for onRequestPermissionsResult

    boolean allPermissionsGranted = true;

    String[] permissionsToRequest =
            {
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.BLUETOOTH,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION
            };

    for(String permission : permissionsToRequest)
    {
        allPermissionsGranted = allPermissionsGranted &&
                (ContextCompat.checkSelfPermission(this, permission)
                        == PackageManager.PERMISSION_GRANTED);
    }

    if(!allPermissionsGranted)
    {
        ActivityCompat.requestPermissions(this, permissionsToRequest, CODE);
    }
}

The problem is that my BroadcastReceiver never finds other discoverable devices, if a device is already paired, it puts it in a ListView as expected, but once the device is unpaired, it cannot identify it again. 问题是我的BroadcastReceiver从未找到其他可发现的设备,如果设备已经配对,它将按预期方式将其放入ListView,但是一旦设备取消配对,就无法再次识别它。 See screenshots below. 请参见下面的屏幕截图。

Output with no paired devices 没有配对设备的输出

Output with paired devices 与配对设备一起输出

I'm at a loss at this point, it feels like I've tried everything, if anyone has any ideas you'd save my life and I'd be eternally grateful. 在这一点上我很茫然,感觉就像我已经尝试了一切,如果有人有任何想法可以救我一命,我将永远感激不已。

Thanks, 谢谢,

Broadcast Receiver 广播接收器

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

        if(BluetoothDevice.ACTION_FOUND.equals(action))
        {
            BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            if(btDevice.getBondState() != BluetoothDevice.BOND_BONDED)
            {
                newDevicesArrayAdapter.add(btDevice.getName() + "\n" + btDevice.getAddress());
            }
        }
        else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
        {
            setTitle(R.string.select_device);

            if(newDevicesArrayAdapter.getCount() == 0)
            {
                newDevicesArrayAdapter.clear();
                String noDevices = getResources().getText(R.string.none_found).toString();
                newDevicesArrayAdapter.add(noDevices);
            }
        }
    }
};

onCreate - Setup ListView elements and IntentFilters onCreate-设置ListView元素和IntentFilters

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

    setResult(Activity.RESULT_CANCELED);

    pairedDevicesArrayAdapter   = new ArrayAdapter<String>(this, R.layout.device_name);
    newDevicesArrayAdapter      = new ArrayAdapter<String>(this, R.layout.device_name);

    ListView pairedListView     = (ListView) findViewById(R.id.paired_devices);
    ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);

    pairedListView.setAdapter(pairedDevicesArrayAdapter);
    pairedListView.setOnItemClickListener(deviceClickListener);
    newDevicesListView.setAdapter(pairedDevicesArrayAdapter);
    newDevicesListView.setOnItemClickListener(deviceClickListener);

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

    filter              = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(broadcastReceiver, filter);
}

doDiscovery() - Called by onStart method, I've verified that it gets called doDiscovery() -由onStart方法调用,我已验证它是否已调用

private void doDiscovery()
{
    Log.d(TAG, "doDiscovery()");

    requestPermissions();

    setTitle(R.string.scanning);

    findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);

    if(btAdapter.isDiscovering()) { btAdapter.cancelDiscovery(); }

    newDevicesArrayAdapter.clear();
    btAdapter.startDiscovery();
}

Turns out I was just being stupid and had values updating to both ListViews, so I never saw the list of other devices. 原来我只是很愚蠢,并且值都更新到两个ListViews,所以我再也没有看到其他设备的列表。

pairedListView.setAdapter(pairedDevicesArrayAdapter);
pairedListView.setOnItemClickListener(deviceClickListener);
newDevicesListView.setAdapter(pairedDevicesArrayAdapter);
newDevicesListView.setOnItemClickListener(deviceClickListener);

Should have been: 本来应该:

pairedListView.setAdapter(pairedDevicesArrayAdapter);
pairedListView.setOnItemClickListener(deviceClickListener);
newDevicesListView.setAdapter(newDevicesArrayAdapter);
newDevicesListView.setOnItemClickListener(deviceClickListener);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM