2010-03-13 138 views
5

我在使Android设备配对时出现问题。如果我进入设置,并手动配对他们,我可以让他们使用下面的代码进行连接:Android蓝牙无法配对

服务器

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connect); 

    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
    startActivityForResult(discoverableIntent, REQUEST_ENABLE_BT); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == REQUEST_ENABLE_BT) 
    { 
     if(resultCode == RESULT_CANCELED) 
     { 
      new AlertDialog.Builder(this) 
      .setTitle(R.string.error) 
      .setMessage(R.string.bluetooth_unavailable) 
      .setPositiveButton(android.R.string.ok, AndroidUtils.DismissListener) 
      .create() 
      .show(); 
     } 
     else 
     { 
      mServerSocket = mAdapter.listenUsingRfcommWithServiceRecord("Moo Productions Bluetooth Server", mUUID); 
      mState = State.ACCEPTING; 
      BluetoothSocket socket = mServerSocket.accept(); 
      mServerSocket.close(); 
      connected(socket); 
     } 
    } 
} 

客户

Set<BluetoothDevice> pairedDevices = mAdapter.getBondedDevices(); 
BluetoothSocket socket = null; 

// Search the list of paired devices for the right one 
for(BluetoothDevice device : pairedDevices) 
{ 
    try 
    { 
     mState = State.SEARCHING; 
     socket = device.createRfcommSocketToServiceRecord(mUUID); 
     mState = State.CONNECTING; 
     socket.connect(); 
     connected(socket); 
     break; 
    } 
    catch (IOException e) 
    { 
     socket = null; 
     continue; 
    } 
} 

但如果设备尚未配对,则无法连接就无法使用到有效的套接字。在那种情况下,我开始发现。

// If that didn't work, discover 
if(socket == null) 
{ 
    mState = State.SEARCHING; 
    mReceiver = new SocketReceiver(); 
    mContext.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
    mAdapter.startDiscovery(); 
} 

// ... Later ... 

private class SocketReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) 
     { 
      try 
      { 
       // Get the device and try to open a socket 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
       mState = State.CONNECTING; 
       socket.connect(); 

       // This is our boy, so stop looking 
       mAdapter.cancelDiscovery(); 
       mContext.unregisterReceiver(mReceiver); 

       connected(socket); 
      } 
      catch (IOException ioe) 
      { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

但它永远不会找到其他设备。我从来没有得到一个配对对话框,当我一步一步看到它发现了正确的设备,但它无法连接这个异常java.io.IOException: Service discovery failed。任何想法,我失踪了什么?

+0

嗨CaseyB howz u?我也在同样的问题在这里stucking .means当我从一个设备连接到其他设备连接,如果我从第二个到第一个设备登录猫显示消息“服务发现失败”,那么为什么它不连接其他设备我试过它不同的UUId的帮助我。 – shyam 2012-04-03 07:38:26

+0

我从来没有想到这一点。我转到另一个项目。抱歉。 – CaseyB 2012-04-03 14:13:23

回答

3

如果服务器实际上不可发现,则您的客户永远不会发现服务器。你的服务器代码的评论说:“确保它可以发现的设备”,但在一个套接字上听并不意味着该设备是可发现的。您可以让服务器发现通过调用:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
startActivity(discoverableIntent); 

这是一个意向,因为曝光率必须由系统启用,只有从用户(所以这将引发一个对话框,要求可发现300秒)的批准。只有在300秒的时间内,服务器才会被发现。在此期间,您的客户端代码应该可以正常工作,并且会得到配对请求。

这一切详细介绍Android开发人员指南: http://developer.android.com/guide/topics/wireless/bluetooth.html

+0

我确实使用该代码,为了简洁起见,我只是在那里发表评论。我试图让代码片段更小。 – CaseyB 2010-03-16 16:17:03

+0

我会更新我的代码以使其更完整。 – CaseyB 2010-03-16 17:15:59

0

不知道它是否仍然是相关的,但我确实是这样的,它的工作:

if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
    discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
} 

if (discoveredDeviceName.equals("your_device_name")) { 
    mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
} 

而且,我会尝试在之前取消发现:

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(mUUID); 
socket.connect();