I'm connecting to an RN42 bluetooth module which does a standard rfcomm
protocol with the standard SPP UID.
The problem is that connect times out sometimes and sometimes it doesn't.
How to 'reproduce':
1) do a standard connect() to get a socket
2) connect() times out and throws an exception
3) wait a bit (1 - 10 sec)
4) do another connect() and it works
It doesn't matter if it's a secure, insecure or the secret hidden API call
to connect() without uuid.
Sometimes it works straight away and then perhaps for a day but the API
certainly "feels" when I present the program to a potential customer and it
decides not to connect. ;)
Here is my code which mininises it by essentially just trying connect() a
couple of times. Ugly, but it works sort of. Adding a delay, trying to
connect again and usually it works at the 2nd attempt but sometimes even
all attempts fail. Then I restart the program and it works at the 1st or
2nd attempt. I know that loads of people report the same problem and some
have theories that it's only on an HTC but not on other devices etc. I can
confirm the problem is on both a Nexus 7 and on a Sony Z3. Both run 6.0.1
and API 23.
Any feedback would be very welcome so that I can get rid of this cascase of
connects.
Best
/Bernd
if (bluetoothDevice == null) return;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
mmSocket =
bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);
} catch (Exception ex) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Could not get rfComm socket:", ex);
}
try {
mmSocket.close();
} catch (Exception closeExeption) {
}
;
mmSocket = null;
messageListener.haveMessage(MESSAGE_ERROR);
return;
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Got rfComm socket!");
}
try {
sleep(100);
} catch (Exception esleep) {
}
;
if (mmSocket != null) {
try {
if (mmSocket != null) {
mmSocket.connect();
}
} catch (IOException connectException) {
// connection failed
messageListener.haveMessage(MESSAGE_RETRY);
try {
mmSocket.close();
} catch (IOException e1) {}
// let's just wait a bit
try {
sleep(100);
} catch (InterruptedException e1) {}
// let's try to connect
try {
if (mmSocket != null) {
mmSocket.connect();
}
} catch (IOException e2) {
try {
sleep(100);
} catch (InterruptedException e3) {
}
try {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Last resort: we try the hidden API");
}
mmSocket.close();
mmSocket = null;
Method createMethod = bluetoothDevice.getClass().
getMethod("createInsecureRfcommSocket", new
Class[]{int.class});
mmSocket = (BluetoothSocket)
createMethod.invoke(bluetoothDevice, 1);
} catch (Exception e) {
if (Log.isLoggable(TAG, Log.ERROR)) {
Log.e(TAG, "Could not get non-UUID based bluetooth
socket!", e);
}
mmSocket = null;
return;
}
try {
sleep(100);
} catch (InterruptedException e3) {
}
try {
if (mmSocket != null) {
mmSocket.connect();
}
} catch (IOException e4) {
try {
mmSocket.close();
mmSocket = null;
} catch (IOException e) {
}
connectionEstablished = false;
fatalError = true;
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Could not establish connection to Attys: " +
e4.getMessage());
}
messageListener.haveMessage(MESSAGE_ERROR);
return;
}
}
}
connectionEstablished = true;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Connected to socket!");
}
}
}
/Bernd
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/0131b190-f15a-437a-9ce2-edf08b6d1251%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.