2014-11-17 1 views
3

Я пытаюсь заставить два устройства Android взаимодействовать друг с другом с помощью WiFi Direct. Я перечисляю доступные устройства в ListView, и когда пользователь нажимает на устройство, я запускаю соединение, вызывая метод connect из класса WifiP2pManager. В методе onSucces я вызываю метод requestConnectionInfo, чтобы получить IP-адрес владельца группы, чтобы я мог подключиться к ServerSocket.Android Wi-Fi Direct: объект WifiP2pInfo передан onConnectionInfoAvailable callback имеет свойство null groupOwnerAddress

Проблема в том, что в первый раз, когда я пытаюсь подключить объект WifiP2pInfo, переданный по адресу onConnectionInfoAvailable, обратный вызов имеет значение null groupOwnerAddress. Это не имеет смысла для меня, потому что я вызываю reuestConnectionInfo внутри обратного вызова onSuccess метода подключения, то есть соединение уже установлено.

Если я попытаюсь подключиться снова, нажав на имя устройства снова), через несколько секунд объект WifiP2pInfo теперь содержит адрес GO, и я могу инициировать TCP-соединение.

Я попытался сделать нить сна в течение нескольких секунд, прежде чем вызывать requestConnectionInfo, но у меня все еще такая же проблема.

@Override 
public void onDialogPositiveClick(DialogFragment dialog, final String enteredPin) { 

    WifiP2pConfig config = new WifiP2pConfig(); 
    config.deviceAddress = mDevice.deviceAddress; 
    config.groupOwnerIntent = 0; 
    mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() { 
     @Override 
     public void onSuccess() { 

      mManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() { 
       @Override 
       public void onConnectionInfoAvailable(WifiP2pInfo info) { 
        InetAddress ownerAddress=info.groupOwnerAddress; 

        if (ownerAddress!=null) { 
         Log.d("MainActivity ",ownerAddress.toString()); 
         ConnectAsyncTask asyncTask=new ConnectAsyncTask(MainActivity.this,ownerAddress,8888,enteredPin); 
         asyncTask.execute(); 
        } else { 
         Toast.makeText(MainActivity.this, "Connection failed! Try again!", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 

     @Override 
     public void onFailure(int reason) { 

     } 
    }); 
} 

ответ

5

ConnectionInfo доступен, когда WIFI_P2P_CONNECTION_CHANGED_ACTION транслируется. Эта трансляция срабатывает, когда WifiP2pDevice подключен или отключен. Это твоя проблема. Если устройство отключено, эта трансляция срабатывает, но это устройство больше не находится в группе. Вы должны проверить действие изменения, чтобы решить, подключено или отключено устройство. :

public void onConnectionInfoAvailable(WifiP2pInfo info) { 
    NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); 
    if (networkInfo.isConnected()) { 
     //connected 
    } else { 
     //disconnected 
    } 
} 
+0

Да, вы абсолютно правы, это решило мою проблему. И именно там, в документации для Android WiFi P2P, я должен был сделать больше чтения. Большое спасибо. PS Я бы поднял ваш ответ, но у меня до сих пор нет репутации, я сделаю это, когда смогу .. – idzikovski