0

Я хочу, чтобы мое приложение автоматически подключалось к уже подключенному устройству Bluetooth при перезапуске приложения. Ниже приведена процедура, которую я выполняю: -Android: широковещательный приемник не получает BluetoothDevice.ACTION_ACL_CONNECTED при перезапуске приложения

  1. [Изначально] Устройство Bluetooth установлено «ВКЛ»: затем при запуске приложения.
    [Поведение] -> устройство Bluetooth получает в паре и подключен успешно (Intent «ACTION_ACL_CONNECTED» получено)

  2. устройство Bluetooth является «ON»: Закрыл приложение, а затем начал приложение снова.
    [Поведение] -> Несмотря на то, что он подключен, как показано на настройке Bluetooth, а широковещательный приемник не получает Intent 'ACTION_ACL_CONNECTED'.

Примечание: - При закрытии приложения он не отключает соединение Bluetooth. Итак, при успешном подключении приложение сразу переходит на HomeScreen. В противном случае приложение переходит на экран с кнопкой, которая переводит его в настройку Bluetooth (onClickListener присутствует в коде ниже)

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

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_index); 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED); 
     registerReceiver(mReceiver, filter); 
     IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED); 
     this.registerReceiver(mReceiver, filter1); 
     m_app = (BtApp) getApplication(); 
     imagebt = (ImageView) this.findViewById(R.id.imagebt); 

     imagebt.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       final Toast tag = Toast.makeText(getApplicationContext(), "Connect to device", Toast.LENGTH_LONG); 
       tag.show(); 

       new CountDownTimer(1000, 1000) 
       { 

        public void onTick(long millisUntilFinished) {tag.show();} 
        public void onFinish() { 
         //tag.show(); 
        } 

       }.start(); 

       if(mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()){ 
        mBluetoothAdapter.startDiscovery(); 
       } 

       Intent intentBluetooth = new Intent(); 
       intentBluetooth.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); 
       startActivity(intentBluetooth); 

       } 
     }); 

    } 

private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { 
       m_app.m_main.setupCommPort(); 
       device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       m_app.m_device = device; 
       isconnected = true; 
       new Timer().schedule(new TimerTask() { 
        @Override 
        public void run() { 
         if (m_app.m_main.m_BtService != null && m_app.m_main.m_BtService.getState() != BluetoothRFCommService.STATE_CONNECTED) { 
          m_app.m_main.m_BtService.connect(device, false); 
         } 
        } 
       }, 3500); 

      } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { 
       isconnected = false; 
       m_app.m_main.tabHost.setCurrentTab(0); 
      } 

     } 
    }; 


@Override 
    protected void onStop() 
    { 
     unregisterReceiver(mReceiver); 
     super.onStop(); 
    } 

ответ

0

Вы не получите BluetoothDevice.ACTION_ACL_CONNECTED событие, так как устройство все еще подключен. Событие запускается только при изменении состояния устройства от отсоединенного до подключенного.

У вас есть 2 варианта.

  1. Вы можете поместить свои BroadcastReceiver с BluetoothDevice.ACTION_ACL_CONNECTED и BluetoothDevice.ACTION_ACL_DISCONNECTED фильтров в Service и отслеживать состояние подключения устройства в фоновом режиме. При запуске приложения вы можете попросить услугу предоставить вам текущее состояние устройства.

  2. Вы можете проверить, содержит ли некоторые профили Bluetooth имя вашего устройства в списке подключенных устройств.

Для API 18+ вы можете использовать BluetoothManager#getConnectedDevices() для API ниже 18 вы можете использовать следующий фрагмент кода (для каждого профиля Bluetooth)

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() { 
    public void onServiceConnected(int profile, BluetoothProfile proxy) { 
     for (BluetoothDevice device : proxy.getConnectedDevices()) { 
      if (device.getName().contains("DEVICE_NAME")) { 
       deviceConnected = true; 
      } 
     } 

     if (!deviceConnected) { 
      Toast.makeText(getActivity(), "DEVICE NOT CONNECTED", Toast.LENGTH_SHORT).show(); 
     } 
     mBluetoothAdapter.closeProfileProxy(profile, proxy); 

    } 

    public void onServiceDisconnected(int profile) { 
     // TODO 
    } 
}; 

mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.A2DP); 
Смежные вопросы