Par programme à se connecter à Bluetooth haut-parleur et la lecture de l'audio

Dans notre application, je tiens à vous connecter à un déjà été associé A2DP Bluetooth haut-Parleur direct et la lecture audio, en utilisant Android v4.2 ou une version ultérieure.

Je peux créer un profil A2DP objet à l'aide de ce code pour démarrer le processus:


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

//Get the default adapter
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

//Establish connection to the proxy.
mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.A2DP)

Et suivants auditeur de répondre à la connexion:

private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {

    if (profile == BluetoothProfile.A2DP) {

        mBluetoothSpeaker = (BluetoothA2dp) proxy;

        //no devices are connected         
        List<BluetoothDevice> connectedDevices = mBluetoothSpeaker.getConnectedDevices();

        //the one paired (and disconnected) speaker is returned here
        int[] statesToCheck = {BluetoothA2dp.STATE_DISCONNECTED};           
        List<BluetoothDevice> disconnectedDevices = mBluetoothSpeaker.getDevicesMatchingConnectionStates(statesToCheck);



        BluetoothDevice btSpeaker = disconnectedDevices.get(0); 

        //WHAT NOW?

    }
}
public void onServiceDisconnected(int profile) {
    if (profile == BluetoothProfile.A2DP) {
        mBluetoothSpeaker = null;
    }
}
};

Je suis juste un peu perdu pour savoir quoi faire maintenant, connecter l'appareil, et de diriger la sortie audio vers elle. J'ai essayé la connexion à l'appareil, comme détaillé dans les docs Android, avec le code suivant, mais au final, BluetoothSpeaker.getConnectedDevices() appel renvoie pas les périphériques connectés.

    BluetoothSocket tmp = null;
    UUID MY_UUID = UUID.fromString("00001108-0000-1000-8000-00805f9b34fb");
    try {           
        tmp = btSpeaker.createInsecureRfcommSocketToServiceRecord(MY_UUID);

    } catch (IOException e1) {
        //TODO Auto-generated catch block
        Log.d("createRfcommSocketToServiceRecord ERROR", e1.getMessage());
    }
    mmSocket = tmp;

    try {
        //Connect the device through the socket. This will block
        //until it succeeds or throws an exception
        mmSocket.connect();
    } catch (IOException connectException) {
        //Unable to connect; close the socket and get out
        try {
            Log.d("connectException", connectException.getMessage());
            mmSocket.close();
        } catch (IOException closeException) { }
        return;
    }

    connectedDevices = mBluetoothSpeaker.getConnectedDevices();

Le code ne semble pas se connecter à l'appareil une certaine façon même si, comme quand j'ai arrêter l'exécution, le Bluetooth speaker annonce qu'il est prêt à paire (comme il le fait toujours lorsqu'il se déconnecte à partir d'une source audio).

Les anciennes versions de la BluetoothA2dp semblent avoir un connect(BluetoothDevice device) méthode, mais qui a maintenant été supprimée (comme d'4.2) et j'ai du mal à trouver un quelconque des exemples clairs de la procédure de programmation pour vous connecter à un appareil A2DP, et à diriger l'audio de sortie à elle. Toute aide sur la façon d'aborder un ou l'autre serait la bienvenue.

Des conseils sur la façon d'aborder ce serait très apprécié.

  • Je suis en supposant que vous êtes en train de créer votre mProfileListener instance AVANT d'appeler getProfileProxy(...)?
  • Oui, le onServiceConnected bloc feux heureusement.
  • La réponse à cette question stackoverflow.com/questions/12542523/... et les commentaires sur il ne semble pas prometteuse.
  • Grâce Squonk, je peux l'obtenir de l'appareil à connecter (ou au moins tirer un BluetoothDevice.ACTION_ACL_CONNECTED événement) en appelant createInsecureRfcommSocketToServiceRecord(), mais si ce poste est à droite, puis RFcomm est mauvais pour A2DP radiodiffusion de toute façon. Quelle est la bonne façon de se connecter à un appareil pour A2DP? Il semble y avoir un trou béant dans le Android Bluetooth de documentation (ou au moins ma compréhension de celui-ci).
  • Pour être honnête, je ne sais pas car je n'ai jamais essayé avec A2DP mais je suis d'accord il y a une lacune dans la documentation. Il est curieux, il y a des options pour A2DP, mais pas de méthodes utiles pour l'utiliser (ou au moins n'est pas utile de la documentation expliquant comment l'utiliser). Si je tombe sur quelque chose que je vais revenir à vous.
  • Grâce Squonk, très apprécié. Il est bon d'avoir un peu de confirmation que je ne suis pas juste totalement stupide. Si vous apercevez quelque chose par rapport à ce dans un avenir proche (et souviens encore de ce post!) J'aimerais en entendre parler. Je pense que pour l'instant notre travail autour devra être popping ouvert les OS les commandes Bluetooth à partir de notre application.
  • Hey. Avez-vous trouvez une solution? Parce que j'ai le même problème que vous. Je ne peux pas transférer de la musique sur les haut-parleurs.
  • Bonjour Silvia, désolé, mais depuis l'affichage de cette question que j'ai travaillé sur d'autres aspects de ce projet, et pour l'instant, les utilisateurs de se connecter à des périphériques Bluetooth haut-parleurs manuellement dans Android. Avez-vous essayé le code que zxshi affichés ci-dessous? Il serait bon de savoir si cela fonctionne ou pas!
  • Oui j'ai essayé, mais ça ne marche pas pour moi non plus. C'est vraiment étrange, j'ai un code qui fonctionne vraiment bien sur 4.0.3 et 4.1, mais pas sur 4.2 plus. J'ai lu ce maintenant plusieurs fois que cela ne fonctionne pas sur 4.2 plus, mais j'ai toujours pas trouvé de solution pour elle.

InformationsquelleAutor Ted | 2014-03-06