J'essaie de connecter des appareils via mon application installée dans Nexus 5.Je souhaite créer une application telle que contacts Rainbow dans Android. Dans mon application, je souhaite connecter à un autre appareil via Bluetooth et transférer un ensemble de contacts ou de fichiers . J'ai suivi cette question , mais la solution de contournement mentionnée ici ne fonctionne pas pour moi Ici est mon code complet ..__ Ceci est l'extrait de code de mon application où j'ai essayé d'obtenir le socket et d'établir des connexions.
_ {Je parviens à passer à travers le dialogue d'appareil de couplage, mais lorsque j'essaie d'apparier, une erreur est générée}
//to create socket
if (secure) {
bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
} else {
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
}
//connection establishment
try {
bluetoothSocket.connect();
success = true;
break;
} catch (IOException e) {
//try the fallback
try {
Class<?> clazz = tmp.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[] {Integer.TYPE};
Method m = clazz.getMethod("createRfcommSocket", paramTypes);
Object[] params = new Object[] {Integer.valueOf(1)};
bluetoothSocket = (BluetoothSocket) m.invoke(tmp.getRemoteDevice(), params);
Thread.sleep(500);
bluetoothSocket.connect();
success = true;
break;
} catch (FallbackException e1) {
Log.w("BT", "Could not initialize FallbackBluetoothSocket classes.", e);
} catch (InterruptedException e1) {
Log.w("BT", e1.getMessage(), e1);
} catch (IOException e1) {
Log.w("BT", "Fallback failed. Cancelling.", e1);
}
}
Erreur je reçois
09-06 13:44:57.247 27860-27860/com.example.gauravdubey.myapplication I/BT﹕ Attempting to connect to Protocol: 00001101-0000-1000-8000-00805f9b34fb
09-06 13:44:57.247 27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:57.247 27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[56]}
09-06 13:44:58.667 27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:58.667 27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[59]}
09-06 13:45:03.267 27860-27860/com.example.gauravdubey.myapplication W/BT﹕ Fallback failed. Cancelling.
Java.io.IOException: read failed, socket might closed or timeout, read ret: -1
at Android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.Java:505)
at Android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.Java:482)
at Android.bluetooth.BluetoothSocket.connect(BluetoothSocket.Java:324)
at com.example.gauravdubey.myapplication.BluetoothConnector$FallbackBluetoothSocket.connect(BluetoothConnector.Java:198)
at com.example.gauravdubey.myapplication.BluetoothConnector.connect(BluetoothConnector.Java:62)
at com.example.gauravdubey.myapplication.ConnectThread.run(ConnectThread.Java:101)
at com.example.gauravdubey.myapplication.MainActivity$1.onItemClick(MainActivity.Java:288)
at Android.widget.AdapterView.performItemClick(AdapterView.Java:299)
at Android.widget.AbsListView.performItemClick(AbsListView.Java:1113)
at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2911)
at Android.widget.AbsListView$3.run(AbsListView.Java:3645)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5001)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:785)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:601)
at dalvik.system.NativeStart.main(Native Method)
09-06 13:45:03.267 27860-27860/com.example.gauravdubey.myapplication V/connectThread﹕ Could not connect to device: B0:D0:9C:8B:A4:47
09-06 13:45:03.267 27860-27860/com.example.gauravdubey.myapplication I/Choreographer﹕ Skipped 361 frames! The application may be doing too much work on its main thread.
Alors qu'est-ce que je fais mal? Toute aide serait appréciée
Dans le constructeur de BluetoothConnector.Java , une liste de uuidCandidates est transmise.
public BluetoothConnector(BluetoothDevice device, boolean secure, BluetoothAdapter adapter,
List<UUID> uuidCandidates)
{
this.device = device;
this.secure = secure;
this.adapter = adapter;
this.uuidCandidates = uuidCandidates;
if (this.uuidCandidates == null || this.uuidCandidates.isEmpty()) {
this.uuidCandidates = new ArrayList<UUID>();
this.uuidCandidates.add(UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"));
}
}
L'as-tu passé nul?
Si oui, essayez alors d'appeler device.fetchUuidsWithSdp()
pour le périphérique Bluetooth que vous souhaitez connecter et recevez BluetoothDevice.ACTION_UUID
intentionnel dans votre récepteur. Une liste des uuids pris en charge par ce périphérique sera également récupérée.
Cache sale. Recherchez où, sur le périphérique, vider le cache de l'application, puis redémarrez. Vous pouvez avoir un interrupteur de contrôle de flux de périphérique (pare-feu, mur d'applications, logiciel de sécurité) qui intercepte le port et le réémet - c'est le problème. En fonction de l'endroit où elle s'installe au démarrage, c'est maintenant différent de ce que votre application veut. Par conséquent, reconstruisez la table en enregistrant le cache et en redémarrant pour reconstruire les tables cache/redirection. Je sais que cela semble terriblement éphémère, mais cela a fonctionné pour moi.
Dans try
("// try the fallback"), utilisez ceci:
socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
socket.connect();
Une autre astuce consiste peut-être à utiliser un UUID différent, cela peut résoudre le problème.
Je ne sais pas si vous l'avez déjà essayé, mais de la même manière que dans l'exemple de chat bluetooth , juste avant de créer votre ConnectThread, appelez cette fonction:
public synchronized void connect(BluetoothDevice device) {
// Cancel any thread attempting to make a connection
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// Start the thread to connect with the given device
mConnectThread = new ConnectThread(device);
mConnectThread.start();
setState(STATE_CONNECTING);
}
J'ai cette chose la plus étrange sur le système Android 5.0 que vous pourriez avoir à vider le cache Comme suggéré ici: http://www.gottabemobile.com/2014/12/01/nexus-Lollipop-problems-fixes/
et vous devrez peut-être également déconnecter le dongle bt pour qu’il n’occupe pas la connexion précédente en mémoire si vous utilisez un ordinateur et un émetteur bt pas cher