2017-01-19 21 views
0

同じアプリを実行している複数の端末に接続しようとして問題が発生しています。私のアプリのワークフローは次のとおりです。ピアが、私は、ユーザーが、彼らが(参照コードに接続したいピアかを選択することができますAlertDialogを表示するに発見されるとAndroid Wi-Fi Direct P2Pが複数の端末に接続

  1. つのデバイスの呼び出しは、ピア(コードAを参照)
  2. を発見しますB)
  3. ユーザーが接続するデバイスを選択すると、WifiP2pDeviceListをループし、渡された各デバイスのconnectメソッドを呼び出します(私は常に現在のデバイスの意図をグループ所有者として設定します) (コードC参照)
  4. 一度接続するとデータが転送されます....

問題:問題が発生した場合は、手順3でコードを最初のデバイスに接続しますが、選択された2番目または3番目のデバイスに接続する2番目のループ反復になります。私は理由コード2(Busy)で失敗します。なぜこうなった?私は1つのデバイスにのみ接続するとすべて正常に動作しますが、複数のデバイスに接続しようとすると問題が発生するのはなぜですか?私は間違って何をしていますか?私は複数のデバイスに接続する方法の例を見つけることができません...どんな助けも大歓迎です。

コード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がまだ最初のデバイス接続プロセスを完了していないことです(接続を受け入れて確立しても、グループを作成してリソースを解放するまでにはまだ時間がかかります)。

この問題を解決するには、2番目のデバイスへの接続を試行するために、少し遅れて(私のテストから少なくとも10-15秒)別のスレッドを開始することができます。

グッドラック。

関連する問題