安卓蓝牙配对失败

5
我有一个在安卓设备上配对设备的问题。如果我进入设置并手动配对,我可以使用以下代码连接它们:

服务器

@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;
    }
}

但如果设备还没有配对,它将在foreach循环之外退出而不连接到有效的套接字。在这种情况下,我开始进行发现。

// 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。你有什么想法,我漏掉了什么吗?


嗨,CaseyB,你好吗?我也遇到了同样的问题。当我从一个设备连接到另一个设备时,它可以连接,但是当我从第二个设备连接到第一个设备时,日志会显示“服务发现失败”的消息,为什么其他设备无法连接呢?我已经尝试使用不同的UUID,但仍然无法解决,请帮帮我。 - shyam
我从来没有能够弄清楚这个问题。我转而去做另一个项目了。抱歉。 - CaseyB
2个回答

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

我确实使用了那段代码,只是为了简洁起见在那里加了注释。我试图让代码片段更小。 - CaseyB

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接