Я занимаюсь разработкой распределенного приложения, которое обменивается данными через Wi-Fi Direct, но я новичок в этой технологии и в настоящее время возился с ней.Но я сталкиваюсь с этой проблемой.Итак, сначала я определю среду:
Существует одно приложение для Android, разрабатываемое с использованием Xamarin (поэтому весь код будет на C #).У него есть только одно действие MainActivity
.
Я развернул его на двух разных устройствах:
Важно : на обоих из них я могу искать пиров с помощью WiFi Direct прямо из встроенногов настройках сети, поэтому это не должно быть аппаратной проблемой.
А в чем проблема?Ну, с устройством MotoG3 приложение работает нормально, оно находит другое устройство (Mi A1) и какое-то соседнее устройство.Но когда он работает на устройстве Mi A1, он не найдет никаких пиров.При отладке обратный вызов OnPeersAvailable
имеет для параметра пустой WifiP2pDeviceList
.
Я знаю, что ситуация действительно выглядит как проблемы совместимости между Android SDK, но я попробовал все, что я прочитал: добавлениеобновление до последней целевой платформы, попытка обеих конфигураций 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
Я думаю, что ничего не оставил, если есть ещеИнформация для обмена, просто спросите.
Любая помощь будет приветствоваться.
Спасибо.