WifiP2pManager.connect可能失败的原因是什么?

5
我有一个执行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 7)中的任何一个是发起者时。有什么想法可能是问题?
1个回答

25

在搜索了Android源代码数小时后,我找到了问题所在。

错误是由WifiP2pService类抛出的。原因是我尝试连接的设备不在内部附近对等体列表中。

但为什么设备不在对等体列表中呢!?

经过更深入的研究,我发现当扫描完成后,对等体列表会被清除。

那么我的连接失败是因为我在启动连接之前调用了stopScan()方法。删除此行代码后,连接成功建立。

为什么我停止了扫描?
我在完成Bluetooth功能实现后立即转向WiFi-Direct。 Bluetooth文档明确表示在连接到设备之前停止任何正在进行的扫描,以节省带宽并加快进程速度。因此,我认为在WiFi-Direct上也要这样做。不要这样做。


感谢您!当您停止发现时,您会停止设备。所以请不要这样做。 - Devendra Gohel
从蓝牙返回后,我有完全相同的经验。谢谢你分享。您是否知道在建立连接后停止扫描是否可以?我尝试了,它能用。但我不知道是否推荐,或者是否会有任何副作用。 - this.myself
@this.myself:我从未尝试过这样做,但如果它对你有效,那么可能是可以的。仅因为扫描停止而销毁连接将是一个错误。 - Avi Shukron

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