2016-10-22 72 views
3

目前我正在开发一款新的Android应用程序。我需要该应用程序的蓝牙。每次我想通过serversocket/socket系统连接两个(配对)设备时,我无法创建一个工作套接字。它总是返回:在Android上需要选择哪个UUID进行蓝牙连接

java.io.IOException: read failed, socket might closed or timeout, read ret: -1 

所以我的问题是:我使用无效的UUID?如果情况并非如此。你有什么其他的建议可能是错的?

public Accept(BluetoothAdapter bt, BluetoothDevice device, Context context) { 
      try { 
       BluetoothAdapter.getDefaultAdapter().cancelDiscovery(); 
       BluetoothServerSocket tmp = null; 
       try { 
        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00294F9B3423"); 
    //Here is the point when it doesn't work... 
        tmp = bt.listenUsingRfcommWithServiceRecord(context.getResources().getString(R.string.bt_string_for_profile_image), uuid); 
       } catch (Exception e) { 
       } 
       mmServerSocket = tmp; 

       bt_device = device; 
      } catch (Exception e) { 
      } 
     } 

感谢您的帮助提前。

回答

0

我想你是失踪接受陈述在这里。 听完你的下一个陈述后应该是tmp.accept()。这将解决您的问题。所以,你的代码应该是这样的:

try { 
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00294F9B3423"); 
Bluetoothsocket clientSocket; 
//Here is the point when it doesn't work... 
tmp = bt.listenUsingRfcommWithServiceRecord(context.getResources().getString(R.string.bt_string_for_profile_image), uuid); 
clientSocket = tmp.accept(); 
} 

另外,有一点要记下来,接受函数调用就是阻塞代码。

希望这会有所帮助。

+0

首先:感谢您的回复。但我很遗憾地说,这并没有解决我的问题。我可能没有给你足够的代码。我的代码看起来像你可以在这里看到的那样:[link](https://developer.android.com/guide/topics/connectivity/bluetooth.html#ConnectingAsAServer)所以我把它当作一个线程来处理。我在该Thread的run()方法中调用accept() - Methode。 – Swittmann

+0

但是,只要我称之为方法bt.listenUsingRfcommWithServiceRecord(context.getResources()。getString(R.string.bt_string_for_profile_image),uuid); throws serversocket的通道是-1,所以我认为这个方法肯定是个问题? – Swittmann

+0

Ohhh ..对不起,我不知道你的完整代码...现在,你可以在这里做的第一件事是检查listen函数返回的错误代码/异常。这将有助于我们理解错误的原因。在我阅读您提供的链接时,listen可以在这些情况下仅在出现错误时抛出异常,例如蓝牙不可用,或者权限不足或使用频道不正确。“ – aksonlyaks