Android Wi-Fi Direct: onPeersAvailable

14,502

Solution 1

You should implement the onPeersAvailable method inside the PeerListListener.

Please see http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html for more information.

Solution 2

dtheo has answered and point to the nice Android tutorial about this topic. I will just make changes on the OP's code to show how to achieve the requested functions.

According to the official Android guide here, the wifip2p discovery api should be used in this way:

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 instead:

@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's wifi state changing
    }
}

Solution 3

dtheo has answered the question.

I would just like to add a small side-note: For Wi-Fi Direct, both devices needs to be scanning at the same time to discover each other. There is also a scanning time-out which means that discoverability could be lost after some time.

Share:
14,502
Ignacio Alorre
Author by

Ignacio Alorre

Currently learning about big data technologies

Updated on June 20, 2022

Comments

  • Ignacio Alorre
    Ignacio Alorre about 2 years

    I'm developping a simple application based on WiFi Direct for Android that has to connect two devices. To do so I need to call to the función onPeersAvailable(myPeerListListener), but I don't know how.

    My app has this two elements:

    1-Main 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 Class BroadcastReceiver:

    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's wifi state changing
            }
        }
    }
    

    Until now my code should be able to detect peers around the device running the app, which ID should be stored in the variable myPeerListListener. All this take place in the second intend of the BroadcastReceiver method called OnReceiv(), by calling:

     manager.requestPeers(channel, myPeerListListener);
    

    Now I want to manipulate that list. So following the API information it should be calling requestPeers, you can see the API on here:

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

    *Section Discovering Peers

    So what I have tried was to write below a call to:

    manager.onPeersAvailable(myPeerListListener); 
    

    but I get this error:

    The method onPeersAvailable(WifiP2pManager.PeerListListener) is undefined for the type WifiP2pManager

    Could anyone tell me how could I send the PeerListListener to the main activity properly?

    Thank you very much for your time