I finally figured out what the problem was.
The problem is in BluetoothAdapter.getDefaultAdapter().
This method create implicitely a Handler connected to the looper of
the current thread.
And this method is static and returns a singleton.
This mean that the first call, and only the first call, must be done
on a thread that will call Looper.loop() and not just exit !
In BluetoothChat sample, the adapter is created in onCreate() of the
activity :
// Get local Bluetooth adapter
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// If the adapter is null, then Bluetooth is not supported
if (mBluetoothAdapter == null) {
...
}
According to comments, we may think taht this is just to check if a
bluetoothAdapter exists but in fact, if it is not done here (but for
example on AcceptThread), it will not work at all !
So I think that
1/ the implicit usage of the first thread calling a method that return
a singleton is a really bad design
2/ Bluetooth chat sample should maybe have a comment added
3/ BluetoothAdapter.getDefaultAdapter() should maybe start its own
thread. Maybe something like :
private BluetoothAdapter _btAdapter = null;
public synchronized BluetoothAdapter getAdapter() {
if (_btAdapter==null) {
final boolean[] ok = new boolean[] { false };
Thread t = new Thread() {
public void run() {
Looper.prepare();
_btAdapter =
BluetoothAdapter.getDefaultAdapter();
synchronized (ok) {
ok[0]=true;
ok.notify();
}
Looper.loop();
};
};
t.setDaemon(true);
t.setName("bt adapter");
t.start();
synchronized (ok) {
if (ok[0]==false) {
try {
ok.wait();
} catch (InterruptedException e) {
}
}
}
}
return _btAdapter;
}
(this is what I've finally done to correct ...)
my 2 cents ...
On Apr 26, 9:53 pm, mbaroukh <[email protected]> wrote:
> Hi all.
>
> I'm facing a problem I don't find how to handle.
>
> I'm doing an application that listen forbluetoothincomming
> connection.
> As recommanded,
> - I have a BluetoothServerSocket that call
> listenUsingRfcommWithServiceRecord(()
> - I'm asking for the BluetoothSocket with accept() method of
> BluetoothServerSocket.
> - when a connection is received, the BluetoothServerSocket is closed.
>
> First, notice
> thathttp://developer.android.com/guide/topics/wireless/bluetooth.html
> says on "Connecting as a server" section :
> "Unless you want to accept additional connections, call
> [BluetoothServerSocket] close(). "
>
> that's what I've done but, unless I'm wrong, the chat
> Samplehttp://developer.android.com/resources/samples/BluetoothChat/src/com/...
> does not do it although it accept only one connection ...
>
> So the problem is that when listenUsingRfcommWithServiceRecord() is
> called again, the channel change.
> But clients continues to think that the service is on the previous
> channel.
> The problem is not on client side because just stopping/startingbluetoothon
> the android server make the client find the new channel
> for the service.
>
> For now, all I can do is not closing BluetoothServerSocket but if the
> client reconnect quicker than the server calling accept(), the client
> is connected on ... nothing. the call to accept will not return this
> connection.
>
> Does anybody figure out the same problem or have any advice ?
>
> Thanks for any help !
>
> Mike
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en