2013-02-09 289 views
7

我正在尝试检测蓝牙设备当前是否连接到使用API​​ 14或更高版本的Android设备。看起来我应该可以使用BluetoothSocket.isConnected()方法,但无论我做了什么,到目前为止,我只是为了任何东西,连接或不连接而返回假。Android BluetoothSocket.isConnected总是返回false

AndroidManifest包括这些行:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

<!-- Locale 4.x supports API 14 or greater. --> 
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> 

<uses-feature android:name="android.hardware.bluetooth" /> 

,问题中的代码:

protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 

    for (BluetoothDevice device : pairedDevices) { 
     Log.i(Constants.LOG_TAG, String.format(Locale.US, "Device: %s connected: %b", device.getName(), isConnected(device))); //$NON-NLS-1$z 
    } 
} 

private boolean isConnected(BluetoothDevice device) { 
    BluetoothSocket socket = null; 

    // Get a BluetoothSocket for a connection with the given BluetoothDevice 
    UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    try { 
     socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 
    } catch (IOException e) { 
     Log.e(Constants.LOG_TAG, e.getMessage()); //$NON-NLS-1$z 
     return false; 
    } 

    Log.i(Constants.LOG_TAG, socket.toString()); //$NON-NLS-1$z 

    return socket.isConnected(); 
} 

不会引发任何错误,它只是返回 “假” 的时间100%。有没有我不擅长的事情?

回答

0

首先,你为什么要使用反射?这是我的一面红旗。这些API允许您通过蓝牙与其他设备通话,请参阅this link,这样您就不应该使用反射。

在调用方法connect之前,套接字将始终返回未连接状态。看起来你的代码获取套接字,但从来没有试图与它建立连接。您首先需要拨打this method

+0

反射部分来自这个问题的接受答案:http://stackoverflow.com/questions/3397071/service-discovery-failed-exception-using-bluetooth-on-android。我对反思的想法并不感到激动,但我想我记得在别的地方读过,你不应该依赖原始问题中的UUID。 话虽如此,对我来说重要的问题是你的答案的第二部分 - 我试图找到任何连接的BT设备,而不是试图连接任何我自己。这不可能吗?我试图避免必须创建一个服务来监视BT状态的变化。 – jkane001 2013-02-10 00:05:25

+0

Ameen说得对,经过对SO答案和Android文档的更仔细的阅读后,我意识到在这里没有必要进行反思。我用一个更好的“isConnected”方法更新了我的原始问题,但我的问题仍然存在:有没有办法检测BT设备是否连接而不连接它? – jkane001 2013-02-10 00:17:22

2

我相信jkane001已经解决了他的问题,所以我希望这个答案能够帮助别人。

首先插座创建后

socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 

你要初始化由

socket.connect(); 

连接后,你就可以使用socket.isConnected()

由于connect()方法是检查连接状态不会阻塞,因此在套接字可能尚未连接之后立即进行。我建议使用这样的

while(!socket.isConnected() && trial++ < 3){ 
    try { 
     Thread.sleep(300); 
    } catch (Exception e) {} 
} 

顺便说一句,我发现,在一些Android设备isConnected()始终返回false。在这种情况下,只需尝试将某些内容写入套接字并检查是否没有异常。

+0

我发现连接因信号不佳而丢失后,如果调用isConnected(),它仍然返回True。所以我采取了发送一些东西到套接字和捕捉异常。 – VectorVictor 2017-02-10 18:10:17

+0

@VectorVictor正确。 isConnected()不是检查连接是否存活的可靠方法。 – Alex 2017-02-13 09:30:14

2

显然有实现isConnected()的设备和/或Android版本(即该函数存在并且可以调用它),但是比无用的更糟糕,因为它总是返回false。我在运行Android 4.2.2的桌面上安装了Alcatel手机,该手机展现了这种行为。

我的代码假设它是断开的,所以杀死了我的连接线程,这让我疯狂了很长时间。但是,我删除了isConnected()调用,并假定它已连接,并且一切正常!我没有找到更好的方法来检查有效的连接,而不是等待错误并声明连接已经死亡。线程中被阻塞的read()最终会失败。

我们有来自现场的报告,声音相似,并且我们知道该版本的2个问题设备中的2个也在4.2.2上。尚未部署修复程序,因此不确定它是否修复了这些情况。