2

我通过以下方式注册了一项服务

BluetoothServerSocket bs = BluetoothAdapter.getDefaultAdapter().listenUsingInsecureRfcommWithServiceRecord("someName" , UUID.fromString(myUuid)  );

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

============================另一种解决方案==================== ====
:感谢您的回答@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;
}
4

1 回答 1

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);

还要检查这个链接,它处理这个;)

于 2013-09-03T11:53:22.397 回答