2017-01-19 10 views
0

У меня возникли проблемы с попыткой подключения к нескольким устройствам, использующим одно и то же приложение. Рабочий процесс моего приложения является:Android Wi-Fi Direct P2P подключается к нескольким устройствам

  1. один вызовов устройств обнаружить сверстник (см кода A)
  2. раз сверстники обнаружили, что отображать AlertDialog, что позволяет пользователю выбрать, какие всматриваются они хотят подключиться (см код B)
  3. после того, как пользователь выбирает устройства, к которым они хотят подключиться. Я пытаюсь выполнить цикл через WifiP2pDeviceList и вызывать метод подключения на каждом переданном устройстве (я всегда устанавливал намерение текущего устройства как владельца группы) (см. код C)
  4. один раз подключение сделан я перевод некоторые данные ....

Проблема: На шаге 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+" !<<<<<<<<<<<"); 
      } 
     }); 

} 

ответ

1

Правильно, после подключения к первому устройству он не сможет соединиться с кодом ошибки занятости. Причина в том, что WiFiP2P на вашем устройстве еще не завершил процесс подключения к первому устройству (даже если вы приняли соединение и его установили, для создания группы и освобождения ресурсов требуется некоторое время).

Чтобы устранить эту проблему, вы можете запустить другой поток с некоторой задержкой (из моих тестов не менее 10-15 секунд), чтобы попытаться подключиться ко второму устройству.

Goodluck.

 Смежные вопросы

  • Нет связанных вопросов^_^