确定BluetoothServerSocket频道

时间:2013-09-03 11:22:52

标签: android bluetooth

我通过

注册了服务
BluetoothServerSocket bs = BluetoothAdapter.getDefaultAdapter().listenUsingInsecureRfcommWithServiceRecord("someName" , UUID.fromString(myUuid)  );

我的问题是,是否有任何编程方式来确定此服务正在使用哪个频道?

============================另一种解决方案================= =======
: 感谢您的anserw @ Skaard-Solo,但如果我使用反射创建套接字,那么我无法为此提供uuid。
我做了一些研究,并编写了一些可以从BluetoothServerSocket获取通道的简单功能。

public int getChannel(BluetoothServerSocket bsSocket){
    Field[] f = bsSocket.getClass().getDeclaredFields();

    int channel = -1;

    for (Field field : f) {
        if(field.getName().equals("mChannel")){
            field.setAccessible(true);
            try {
                channel = field.getInt(bsSocket);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            field.setAccessible(false);
        }
    }

    return channel;
}

1 个答案:

答案 0 :(得分:1)

否(AFAIK),这可能是一个问题。 Android选择在套接字打开期间免费的频道。

如果你真的需要知道频道,你可以通过反射创建一个rfcomm套接字,并将频道作为参数传递(一种黑客,listenUsingRfcommOn在Android中是@hide):

BluetoothServerSocket tmp = null;
Method m;
m = mAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class });
tmp = (BluetoothServerSocket) m.invoke(mAdapter, BLUETOOTH_CHANNEL);

Check also this link,处理此问题;)