Android Wi-Fi Direct: onPeersAvailable

I am developing a simple WiFi Direct-based application for Android that should connect two devices. To do this, I need to call función onPeersAvailable (myPeerListListener), but I do not know how to do this.

There are two elements in my application:

1-core activity:

package android.nacho.WifiDirect; import android.net.wifi.p2p.WifiP2pManager.Channel; import android.net.wifi.p2p.WifiP2pManager; import android.os.Bundle; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class WifiDirect extends Activity { WifiP2pManager mManager; Channel mChannel; BroadcastReceiver mReceiver; IntentFilter mIntentFilter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wifi_direct); //To register the BroadastReceiver mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); mChannel = mManager.initialize(this, getMainLooper(), null); //It was necessary to make a cast (Channel) mReceiver = new WiFiBroadcastReceiver(mManager, mChannel, this); //, this); //Layout final Button btnScan = (Button)findViewById(R.id.btnScan); final TextView TextDebug=(TextView)findViewById(R.id.TextDebug); //To define the filter in the BroadcastReceiver mIntentFilter = new IntentFilter(); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); final OnClickListener ScanListener=new OnClickListener() //Sacado de TEstPsycologico { public void onClick(View v){ TextDebug.setText("Se intentan buscar Peers"); mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { public void onSuccess() { TextDebug.setText("Ha habido éxito buscando Peers");//DEBUG: Para ver si es posible encontrar Peers } public void onFailure(int reasonCode) { TextDebug.setText("Algo ha salido mal buscando Peers"); //DEBUG: Para ver si pasó algo raro busando Peers } }); onPeersAvailable(myPeerListListener); } }; btnScan.setOnClickListener(ScanListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_wifi_direct, menu); return true; } // @Override protected void onResume() { super.onResume(); registerReceiver(mReceiver, mIntentFilter); } // unregister the broadcast receiver @Override protected void onPause() { super.onPause(); unregisterReceiver(mReceiver); } } 

2 BroadcastReceiver Class:

 package android.nacho.WifiDirect; import android.net.wifi.p2p.WifiP2pManager.Channel; import android.net.wifi.p2p.WifiP2pManager.PeerListListener; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.wifi.p2p.WifiP2pManager; import android.widget.Toast; /** * A BroadcastReceiver that notifies of important Wi-Fi p2p events. */ public class WiFiBroadcastReceiver extends BroadcastReceiver { private WifiP2pManager manager; private Channel channel; private WifiDirect activity; private PeerListListener myPeerListListener; //For toast, add also context //private Context context; public WiFiBroadcastReceiver(WifiP2pManager manager, Channel channel, WifiDirect activity){//, Context context) { super(); this.manager = manager; this.channel = channel; this.activity = activity; // this.context= context; } @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { // Check to see if Wi-Fi is enabled and notify appropriate activity int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { //Toast.makeText(context, "Wi-Fi Direct is enable", Toast.LENGTH_LONG).show(); } else { //Toast.makeText(context, "Wi-Fi Direct is not enable", Toast.LENGTH_LONG).show(); } } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { // Call WifiP2pManager.requestPeers() to get a list of current peers // request available peers from the wifi p2p manager. This is an // asynchronous call and the calling activity is notified with a // callback on PeerListListener.onPeersAvailable() if (manager != null) { manager.requestPeers(channel, myPeerListListener); manager.onPeersAvailable(myPeerListListener); } } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { // Respond to new connection or disconnections } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { // Respond to this device wifi state changing } } } 

Until now, my code was supposed to detect peers around the device on which the application is running, and this identifier should be stored in the variable myPeerListListener . All this happens in the second intention of the BroadcastReceiver method called OnReceiv (), calling:

  manager.requestPeers(channel, myPeerListListener); 

Now I want to manipulate this list. Therefore, following the API information, it should call requestPeers, you can see the API here:

http://developer.android.com/guide/topics/connectivity/wifip2p.html

* Peer Detection Section

So, I tried to write below the call:

 manager.onPeersAvailable(myPeerListListener); 

but I get this error:

OnPeersAvailable method (WifiP2pManager.PeerListListener) undefined for type WifiP2pManager

Can someone tell me how I can properly send the PeerListListener function to the main action?

Thanks so much for your time.

+6
source share
3 answers

You must implement the onPeersAvailable method inside the PeerListListener.

See http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html for details.

+4
source

dtheo responded to a good Android tutorial on this topic. I just make changes to the OP code to show how to execute the requested functions.

According to the official Android manual here , wifip2p api detection should be used as follows:

In your MainActivity class:

 mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { public void onSuccess() { TextDebug.setText("Ha habido éxito buscando Peers"); } public void onFailure(int reasonCode) { TextDebug.setText("Algo ha salido mal buscando Peers"); } }); // ############# DELETE THE FOLLOWING LINE ############# onPeersAvailable(myPeerListListener); // <<<<<<< DELETE THIS LINE 

And in your BroadcastReceiver class do the following:

 @Override public void onReceive(Context context, Intent intent) { ... if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { ... } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { if (manager != null) { manager.requestPeers(channel, new WifiP2pManager.PeerListListener() { @Override public void onPeersAvailable(WifiP2pDeviceList peers) { Log.d(TAG,String.format("PeerListListener: %d peers available, updating device list", peers.getDeviceList().size())); // DO WHATEVER YOU WANT HERE // YOU CAN GET ACCESS TO ALL THE DEVICES YOU FOUND FROM peers OBJECT } }); } } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { // Respond to new connection or disconnections } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { // Respond to this device wifi state changing } } 
+12
source

dtheo answered the question.

I would like to add a small note: for Wi-Fi Direct, both devices must scan at the same time in order to detect each other. There is also a scan timeout, which means that the detection capability may be lost after a while.

+7
source

All Articles