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.

Reply via email to