У меня возникли проблемы с попыткой подключения к нескольким устройствам, использующим одно и то же приложение. Рабочий процесс моего приложения является:Android Wi-Fi Direct P2P подключается к нескольким устройствам
- один вызовов устройств обнаружить сверстник (см кода A)
- раз сверстники обнаружили, что отображать AlertDialog, что позволяет пользователю выбрать, какие всматриваются они хотят подключиться (см код B)
- после того, как пользователь выбирает устройства, к которым они хотят подключиться. Я пытаюсь выполнить цикл через WifiP2pDeviceList и вызывать метод подключения на каждом переданном устройстве (я всегда устанавливал намерение текущего устройства как владельца группы) (см. код C)
- один раз подключение сделан я перевод некоторые данные ....
Проблема: На шаге 3, когда я вызываю метод подключения, код подключается к первому устройству без каких-либо проблем, но когда он добирается до второй итерации цикла, чтобы подключиться ко второму или третьему устройству, которое было выбрано Я получаю сбой с кодом причины 2 (Занято). Почему это происходит? Когда я подключаюсь только к одному устройству, все работает нормально, только когда я пытаюсь подключиться к нескольким, когда у меня есть проблемы? Что я делаю не так? Я не могу найти примеры того, как подключиться к нескольким устройствам ... любая помощь очень ценится.
Код A: (открыть пэров)
private WifiP2pManager mManager;
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
onInitiateDiscovery();
}
@Override
public void onFailure(int reasonCode) {
Toast.makeText(getActivity(), "Discovery Failed: " + getReascodeText(reasonCode), Toast.LENGTH_SHORT).show();
}
});
код B: (выберите сверстникам вы хотите подключиться)
public void onPeersAvailable(WifiP2pDeviceList peers) {
final ArrayList<Integer> itemsSelected = new ArrayList<>();
// Out with the old, in with the new.
mPeers.clear();
mPeers.addAll(peers.getDeviceList());
CharSequence[] cs = StringUtils.getDeviceNames(mPeers);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Who do you want to share with?");
builder.setMultiChoiceItems(cs, null, new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int selectedItemId, boolean isChecked) {
if (isChecked) {
itemsSelected.add(selectedItemId);
} else if (itemsSelected.contains(selectedItemId)) {
itemsSelected.remove(Integer.valueOf(selectedItemId));
}
}
}).setPositiveButton("Done!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
WifiP2pDevice wifiP2pDevice = mPeers.get(itemsSelected.get(0));
List<WifiP2pDevice> devices = extractSelectedDevices(itemsSelected,mPeers);
numConnections = devices.size();
connect(devices);
}
});
mPeerSelectionDialog = builder.create();
mPeerSelectionDialog.show();
}
код C: (подключение к выбранным устройствам)
public void connect(List<WifiP2pDevice> devices) {
for(WifiP2pDevice device: devices) {
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
config.groupOwnerIntent = 15;
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// WiFiDirectBroadcastReceiver will notify us. Ignore for now.
System.out.println("successfully connected!!");
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Successfully Connected!<<<<<<<<<<<");
}
@Override
public void onFailure(int reason) {
Toast.makeText(getActivity(), "Connect failed. Retry.", Toast.LENGTH_SHORT).show();
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Failed connection, rasoncode:"+reason+" !<<<<<<<<<<<");
}
});
}