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'appelergetProfileProxy(...)
? - 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 appelantcreateInsecureRfcommSocketToServiceRecord()
, 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.
Vous devez vous connecter pour publier un commentaire.
Celui-ci fonctionne pour moi.
Après réception de BluetoothA2dp.STATE_CONNECTED, vous pouvez jouer de la musique comme d'habitude.
}
Ted,
J'ai le même problème, comme vous, quand j'ai essayé avec BluetoothHeadset.
Je suppose que mon travail autour de peut travailler avec A2DP.
Depuis mon oreillette uniquement en charge le profil mains libres. Je suis le seul test avec BluetoothHeadset.
Pas nécessaire d'établir canal RFComm.
Pour moi.
Après vous être connecté à BluetoothHeadsetService,
1. vérifier si l'audio est déjà connecté
2. si non, établir une connexion audio
3. registre de BroadcastReceiver pour BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED et BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED
4. BroadcastReceiver
Eu le même problème, mais a constaté que les anciens post:
Par programme à se connecter à l'appareil compatible Bluetooth couplé
En bref, afin de vous connecter à un autre appareil a2dp, vous avez simplement à invoquer BluetoothA2dp.connect(myPairedA2dpDevice), mais pour l'instant, cette méthode est caché de l'API publique, qui n'est pas utile. Si vous y accédez via Java réflexion. C'est une sorte de hack, mais la façon dont Google a mis, il ne semble pas être une solution propre pour l'instant.