0

Je souhaite que mon application se connecte automatiquement au périphérique Bluetooth déjà connecté lors du redémarrage de l'application. Ci-dessous la procédure que j'effectue: -Android: Broadcast Receiver ne reçoit pas BluetoothDevice.ACTION_ACL_CONNECTED lors du redémarrage de l'application

  1. [Initialement] L'appareil Bluetooth est activé (ON): Ensuite, au démarrage de l'application.
    [Comportement] -> appareil Bluetooth se jumelé et connecté (intention « ACTION_ACL_CONNECTED » est reçu) avec succès

  2. appareil Bluetooth est « ON »: Fermé l'application, puis a commencé à nouveau l'application.
    [Comportement] -> Même s'il est connecté comme indiqué dans le paramètre Bluetooth, et Récepteur de diffusion ne reçoit pas l'intention 'ACTION_ACL_CONNECTED'.

Remarque: - À la fermeture de l'application, il ne déconnecte pas la connexion Bluetooth. Ainsi, en cas de succès, l'application de connexion va directement à l'écran d'accueil. Sinon, l'application va à un écran ayant le bouton qui prend pour paramètre Bluetooth (onClickListener présent dans le code ci-dessous)

Je suis nouveau pour le développement android, donc je ne sais vraiment pas où je vais mal. J'ai recherché les solutions pour des problèmes similaires et les ai appliqués, mais sans résultat.

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

Répondre

0

Vous n'obtiendrez événement BluetoothDevice.ACTION_ACL_CONNECTED puisque le dispositif est toujours connecté. L'événement est déclenché uniquement lors du changement d'état de l'appareil de déconnecté à connecté.

Vous avez 2 options.

  1. Vous pouvez mettre vos BroadcastReceiver avec BluetoothDevice.ACTION_ACL_CONNECTED et BluetoothDevice.ACTION_ACL_DISCONNECTED filtres dans la Service et de suivre l'état de connexion de l'appareil en arrière-plan. Au démarrage de votre application, vous pouvez demander au service de vous donner l'état actuel de l'appareil.

  2. Vous pouvez vérifier si certains profils Bluetooth contiennent le nom de votre appareil dans la liste des appareils connectés.

Pour API 18+, vous pouvez utiliser BluetoothManager#getConnectedDevices() pour API en dessous de 18, vous pouvez utiliser l'extrait suivant (pour chaque profil 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);