Я не получаю действия на моем BroadcastReceiver - AndroidStudio - PullRequest
0 голосов
/ 19 июня 2020

Я впервые работаю с модулем Bluetooth в Android. Я пытаюсь просканировать еще не сопряженные устройства и показать их в сообщении, но это не работает. Я много чего перепробовал, но ничего. У меня есть все необходимые разрешения. Это часть моего кода

mScanBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                //registerReceiver(mBroadcastReceiver, filter);

                if(mBlueAdapter!=null && mBlueAdapter.isEnabled()) {
                    listAdapter.clear();
                    mBlueAdapter.startDiscovery();
                    showToast("Discovery");
                    IntentFilter filtera = new IntentFilter();
                    filter.addAction(BluetoothDevice.ACTION_FOUND);
                    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
                    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

                    registerReceiver(mBroadcastReceiver, filter);

                }

А это мой BroadcastReceiver

private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                listAdapter.add(device.getName() + device.getAddress());
                listAdapter.notifyDataSetChanged();
                showToast("Action Scan Mode " );

            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                mpossibleBtn.setText("Scanning Bluetooth Devices");
                showToast("Scannning Bluetooth Devices... " );
            } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
                mpossibleBtn.setText("Scanning in progress...");
                showToast("Scanning in progress... " );
            }


            if (action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) {
                showToast("Action Scan Mode " );
                int modeValue=intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);

                if(modeValue==BluetoothAdapter.SCAN_MODE_CONNECTABLE){
                    mPairedTv.setText("The device is not in discoverable mode but still can receive connections");
                } else if(modeValue==BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE){
                    mPairedTv.setText("The device is in discoverable mode");
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    String deviceName = device.getName();
                    String deviceHardwareAddress = device.getAddress(); // MAC address
                    showToast("onReceive: " + device.getName() + ": " + device.getAddress());
                } else if (modeValue==BluetoothAdapter.SCAN_MODE_NONE){
                    mPairedTv.setText("The device is not in discoverable mode and can't receive connection");
                } else{
                    mPairedTv.setText("Error");
                }
            }
        }
    };

Я тестирую приложение на своем мобильном телефоне Xiaomi.

Ответы [ 3 ]

0 голосов
/ 19 июня 2020

Начать обнаружение после регистрации вашего приемника.

IntentFilter intent = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(mBroadcastReceiver, intent);
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mBroadcastReceiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mBroadcastReceiver, filter);

mBtAdapter.startDiscovery();

Или в вашем случае

IntentFilter filtera = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

registerReceiver(mBroadcastReceiver, filter);
mBtAdapter.startDiscovery();

Также убедитесь, что у вас есть разрешения на bt в вашем манифесте

  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />

На некоторых телефонах вам потребуется сначала перезапустить адаптер.

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

в течение некоторого времени на широковещательном приемнике, если вы не получаете BluetoothAdapter.ACTION_DISCOVERY_STARTED после запуска обнаружения, вы должны запросить перезапуск устройства в качестве bt может не работать должным образом. вы можете использовать таймер, чтобы проверить это.

0 голосов
/ 23 июня 2020

Хорошо, я только что нашел свою ошибку. В этом случае разрешения BLUETOOTH и BLUETOOTH_ADMIN имеют нормальный уровень защиты, поэтому все, что вам нужно сделать, это запросить их в манифесте. Однако разрешения на местоположение опасны, и так далее на Android 6.0+ устройствах с targetSdkVersion 23 или выше вам необходимо запрашивать их во время выполнения.

У меня уже есть разрешения, однако они нам нужны для запроса ACCESS_COARSE_LOCATION во время выполнения.

На этот раз код работает

mScanBtn.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onClick(View v) {

            if(mBlueAdapter!=null && mBlueAdapter.isEnabled()) {
                
                IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                filter.addAction(BluetoothDevice.ACTION_FOUND);
                filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
                filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

                registerReceiver(mBroadcastReceiver, filter);

                if (context.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {
                    if (mMap != null) {
                        mMap.setMyLocationEnabled(true);
                         mBlueAdapter.startDiscovery();
                    }
                }
                else {
                    // Permission to access the location is missing. Show rationale and request permission
                    PermissionUtils.requestPermission(MainActivity.this, MY_PERMISSIONS_REQUEST_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION, true);
                      mBlueAdapter.startDiscovery();
                }

                }

});

0 голосов
/ 19 июня 2020

нужно ДОБАВИТЬ после регистрации получателя

mBtAdapter.startDiscovery();
...