我有一个执行Wifi P2p发现的代码,将附近的设备呈现给用户,并让他选择要连接的设备。
发现按预期工作,但是当我尝试实际连接到所选设备时,系统调用ActionListener.onFailure
并传递"内部错误"的原因代码。
这是启动连接的代码:
public void connectToDevice(WifiP2pDevice device) {
Log.i(TAG, "Initiating connection to " + device.deviceAddress);
stopScan();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
// Since we wish to send a friend request, it will be easier if
// we'll end up as a client because we will have the group owner's
// address immediately.
config.groupOwnerIntent = 0;
mP2pManager.connect(mChannel, config, mConnectionListener);
}
, mConnectionListener
定义如下:
protected ActionListener mConnectionListener = new ActionListener() {
@Override
public void onSuccess() {
Log.i(TAG, "Conection initiated successfuly");
}
@Override
public void onFailure(int reason) {
String reasonString = reason(reason);
Log.e(TAG, "Error while connecting to Wifi peer: " + reasonString);
}
};
当抛出此错误时,设备不属于任何组,并且当任一设备(Nexus 4 &Nexus是始作俑者。
你知道是什么问题吗?
在Android源代码中挖掘了几个小时后,我发现了问题。
错误是由WifiP2pService
类抛出的。原因是我试图连接的设备不在内部邻近对等体列表中。
但是为什么设备不在对等体列表中!?
进一步挖掘后,我发现当扫描完成时,peers列表被清除。
所以导致连接失败的是我在启动连接之前调用的stopScan()
方法。删除此行后,连接成功建立。
为什么我停止了扫描?
在我完成了在蓝牙中实现WiFi-Direct的功能后,我立即开始使用它。关于蓝牙的文档特别指出,在连接到设备之前停止任何正在进行的扫描,以节省带宽并加快进程。所以我想在WiFi-Direct上做同样的事情。