Wi-Fi Direct无法在某些设备上发现对等

时间:2018-12-03 23:25:15

标签: android xamarin xamarin.android p2p wifi-direct

我正在开发一种通过Wi-Fi Direct进行通信的分布式应用程序,但是我是这项技术的新手,目前正在弄混它。但是我面临这个问题。首先,我将定义环境:

有一个使用Xamarin开发的android应用程序(因此所有代码都将使用C#)。它只有一个活动MainActivity

我将其部署到两个不同的设备上:

  • Motorola MotoG3:Android 6.0.1(右图)

  • 小米米A1:Android 8.1.0(左图)

重要:在这两个方面,我都可以直接从内置网络选项中使用WiFi Direct搜索对等节点,因此这不应该是硬件问题。

这是什么问题?好了,使用MotoG3设备,应用程序可以正常运行,它可以找到另一个设备(Mi A1)和某个邻居的设备。但是,当它在Mi A1设备上运行时,将找不到任何同级。调试时,OnPeersAvailable回调的参数为空WifiP2pDeviceList

我知道这种情况确实看起来像android sdks之间的兼容性问题,但是我已经尝试了我读过的所有内容:添加,更新到最后一个目标框架,尝试Release和Debug配置。 。因此,其他任何想法都将受到欢迎。

在以下图像中,我显示了上述两个设备的发现对等操作的结果。左侧:Mi A1(无法正常工作),右侧:MotoG3(正常工作)。



代码段:

在MainActivity.cs中:

 btnDiscover.Click += delegate
    {
        mManager.DiscoverPeers(mChannel, new MyActionListener(this));
    };
    peerListListener = new MyPeersListListener(this);

MyActionListener类

private class MyActionListener : Java.Lang.Object, WifiP2pManager.IActionListener
{
    private MainActivity mActivity;
    public MyActionListener(MainActivity mainActivity)
    {
        this.mActivity = mainActivity;
    }

    public void OnFailure([GeneratedEnum] WifiP2pFailureReason reason)
    {
        mActivity.tvConnStatus.SetText("Discovery starting failed", TextView.BufferType.Normal);
    }

    public void OnSuccess()
    {
        mActivity.tvConnStatus.SetText("Discovery started", TextView.BufferType.Normal);
    }
}

MyPeersListListener类

private class MyPeersListListener : Java.Lang.Object, WifiP2pManager.IPeerListListener
{
    private readonly MainActivity mainActivity;

    public MyPeersListListener(MainActivity mainActivity)
    {
        this.mainActivity = mainActivity;
    }

    public void OnPeersAvailable(WifiP2pDeviceList peersList)
    {
        if (peersList.DeviceList.Count == 0)
        {
            Toast.MakeText(mainActivity.ApplicationContext, "No devices found", ToastLength.Short).Show();
            return;
        }
        if (!peersList.Equals(mainActivity.mPeers))
        {
            mainActivity.mPeers.Clear();
            mainActivity.mPeers.AddRange(peersList.DeviceList);

            mainActivity.devicesNames = new string[peersList.DeviceList.Count];
            mainActivity.devicesArray = new WifiP2pDevice[peersList.DeviceList.Count];
            int i = 0;
            foreach (WifiP2pDevice device in peersList.DeviceList)
            {
                mainActivity.devicesNames[i] = device.DeviceName;
                mainActivity.devicesArray[i] = device;
                i++;
            }
            ArrayAdapter<string> adapter = new ArrayAdapter<string>(mainActivity.ApplicationContext, Android.Resource.Layout.SimpleListItem1, mainActivity.devicesNames);
            mainActivity.lvPeersList.Adapter = adapter;
        }
    }
}

当前授予的权限如下:

  • android.permission.CHANGE_WIFI_STATE
  • android.permission.ACCESS_WIFI_STATE
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.INTERNET
  • android.permission.CHANGE_NETWORK_STATE
  • android.permission.UPDATE_DEVICE_STATS

我想我什么都没留下,如果还有更多信息要分享,那就问一下。

任何帮助都将受到欢迎。

谢谢。

0 个答案:

没有答案