2012-05-28 6 views
4

Я пытаюсь подключить 2 устройства Android через Wi-Fi Direct. В моем приложении я жестко кодирую MAC-адрес другого устройства и вызываю метод connect. Я предполагаю, что Wi-Fi Direct включен в обоих устройствах. Вот код, который я использую:Подключите два устройства через Wi-fi Direct

package com.abc;

import android.app.Activity; 
import android.content.Context; 
import android.content.IntentFilter; 
import android.net.wifi.WpsInfo; 
import android.net.wifi.p2p.WifiP2pConfig; 
import android.net.wifi.p2p.WifiP2pManager; 
import android.net.wifi.p2p.WifiP2pManager.Channel; 
import android.os.Bundle; 
import android.widget.Toast; 

public class WiFiDirectActivity extends Activity { 
/** Called when the activity is first created. */ 
protected WifiP2pManager manager; 
protected Channel channel; 
public WifiP2pConfig config ; 
protected final IntentFilter intentFilter = new IntentFilter(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    intentFilter.addAction (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
    intentFilter 
      .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 
    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
    channel = manager.initialize(this, this.getMainLooper(), null); 
    config = new WifiP2pConfig(); 
    config.deviceAddress = "78:d6:f0:ab:d9:da"; 
    config.groupOwnerIntent = 0; 
    config.wps.setup = WpsInfo.PBC; 

    manager.connect(channel, config, new WifiP2pManager.ActionListener(){ 
     @Override 
     public void onSuccess() { 
      Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_LONG); 

     } 

     @Override 
     public void onFailure(int reason) { 
      Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_LONG); 

     } 
    }); 




} 

}

но это не соединяется. Что не так с моей реализацией?

+0

Пожалуйста, поделитесь своим LogCat сообщением, так мы можем иметь некоторое представление о том, что происходит. – Chucky

ответ

2

У меня есть подобный код работает, основные отличия:

  • Я получаю адрес устройства, призывающий, прежде чем открытия коллег (если вы сделаете это, то вы должны добавить WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION намерению группы фильтров)
  • Я не установить config.groupOwnerIntent

WifiP2pConfig config = new WifiP2pConfig(); 
config.deviceAddress = this.address; 
config.wps.setup = WpsInfo.PBC; 
1

зарегистрировать Инстр astReceiver в onResume() и переопределить его. не забудьте отменить его в OnPause()

private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } 
    } 
} 

затем попытаться вызвать discoverPeers() первым

mWifiP2pManager.discoverPeers(Channel mChannel, ActionListener mActionListener); 

если discoverPeers() не найти коллег, действие WIFI_P2P_PEERS_CHANGED_ACTION будет срабатывать.

мы можем назвать requestPeers() в WIFI_P2P_PEERS_CHANGED_ACTION в BroadcastReceiver

mWifiP2pManager.requestPeers(Channel mChannel, WifiP2pManager.PeerListListener); 

поэтому наша BroadcastReceiver теперь выглядит как этот

private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      mWifiP2pManager.requestPeers(mChannel , pl); 
     } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } 
    } 
} 

реализовать WifiP2pManager.PeerListListener, вам необходимо переопределить onPeersAvailable (WifiP2pDeviceList пэров)

in onPeersAvailable(), параметр wifiP2pDeviceList означает сверстников, которых вы обнаружили

Нам нужен объект пользовательского интерфейса, чтобы мы могли выбрать, какое устройство подключиться, поэтому я использую spinner здесь.

также вы можете использовать listView или что-то еще.

private List<WifiP2pDevice> mPeers = new ArrayList<WifiP2pDevice>(); 
spinnerAdapter = new WiFiPeerListAdapter(this, R.layout.row_devices, mPeers); 
... 
@Override 
public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) { 
    mPeers.clear(); 
    mPeers.addAll(wifiP2pDeviceList.getDeviceList()); 
    spinnerAdapter.notifyDataSetChanged(); 
} 

наконец, мы можем подключить к устройству

WifiP2pDevice device = spinnerAdapter.getItem((int) mSpinner.getSelectedItemId()); 
WifiP2pConfig config = new WifiP2pConfig(); 
config.deviceAddress = device.deviceAddress; 
config.wps.setup = WpsInfo.PBC; 
mWifiP2pManager.connect(mChannel, config, mActionListener); 

после двух подключенного устройства BroadcastReceiver действие WIFI_P2P_CONNECTION_CHANGED_ACTION будет срабатывать. поэтому мы можем что-то сделать здесь.

наш BroadcastReceiver теперь выглядит

private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      mWifiP2pManager.requestPeers(mChannel , pl); 
     } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { 
      NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); 
      if (networkInfo != null) { 
       Log.d(TAG,networkInfo.toString()); 
       if (networkInfo.isConnected()) { 
        mWifiP2pManager.requestConnectionInfo(mChannel, WifiP2pManager.ConnectionInfoListener); 
       } 
      } 
     } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { 
      //TODO 
     } 
    } 
} 

Кстати, журнал в действии WIFI_P2P_CONNECTION_CHANGED_ACTION получите что-то вроде этого

NetworkInfo: type: WIFI_P2P[], state: UNKNOWN/IDLE, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true, simId: 0 

теперь мы должны реализовать WifiP2pManager.ConnectionInfoListener и переопределить его абстрактный метод onConnectionInfoAvailable (данные WifiP2pInfo) для запросаConnectionInfo()

private WifiP2pInfo p2pInfo; 
@Override 
public void onConnectionInfoAvailable(final WifiP2pInfo info) { 
    p2pInfo = info; 
    mWifiP2pManager.requestGroupInfo(mChannel, WifiP2pManager.GroupInfoListener); 
} 

снова мы должны реализовать WifiP2pManager.GroupInfoListener и переопределить onGroupInfoAvailable (WifiP2pGroup группы)

@Override 
public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) { 
    String log; 
    if(wifiP2pGroup.isGroupOwner()) { 
     log = "I am GO"; 
    }else{ 
     log = "I am not GO"; 
    } 
    Log.d(TAG, log); 
} 

теперь мы почти получили все данные об этих двух устройствах

наслаждаться этим