我正在开发一种通过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之间的兼容性问题,但是我已经尝试了我读过的所有内容:添加
在以下图像中,我显示了上述两个设备的发现对等操作的结果。左侧: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;
}
}
}
当前授予的权限如下:
我想我什么都没留下,如果还有更多信息要分享,那就问一下。
任何帮助都将受到欢迎。
谢谢。