我的设备在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果设备尚未配对,则无需连接到有效套接字即可脱离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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它永远不会找到其他设备.我从来没有得到配对对话框,当我单步执行时,我发现它发现了正确的设备,但它无法连接此异常java.io.IOException: Service discovery failed.关于我缺少什么的任何想法?
小智 3
如果服务器实际上不可发现,那么您的客户端将永远不会发现服务器。您的服务器代码的注释是“确保设备可发现”,但监听套接字并不意味着该设备是可发现的。您可以通过调用以下命令使服务器可发现:
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
Run Code Online (Sandbox Code Playgroud)
这是一个 Intent,因为可发现性必须由系统启用,并且只能在用户批准的情况下启用(因此这将引发一个对话框,请求可发现性 300 秒)。只有在这 300 秒的时间段内,服务器才能真正被发现。在此期间,您的客户端代码应该可以正常工作,并且您将收到配对请求。
Android 开发指南对此进行了详细介绍: http://developer.android.com/guide/topics/wireless/bluetooth.html
| 归档时间: |
|
| 查看次数: |
9737 次 |
| 最近记录: |