2012-10-25 11 views
5

Opracowuję prostą aplikację opartą na Wi-Fi Direct na Androida, która musi łączyć dwa urządzenia. Aby to zrobić, muszę zadzwonić do función onPeersAvailable (myPeerListListener), ale nie wiem jak.Android Wi-Fi Direct: onPeersAvailable

Moja aplikacja ma to dwa elementy:

1 Główna działalność:

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 Klasa 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 
     } 
    } 
} 

Do tej pory mój kod powinien być w stanie wykryć rówieśników okolice urządzenie uruchamiające aplikację, którego identyfikator należy przechowywać w zmiennej myPeerListListener. Wszystko to miejsce wziąć w drugim zamierzają metody BroadcastReceiver zwanego OnReceiv(), poprzez wywołanie:

manager.requestPeers(channel, myPeerListListener); 

Teraz chcę manipulować tę listę. Więc następujące informacje API należy wzywającą requestPeers można zobaczyć API tutaj:

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

* Sekcja Discovering Peers

więc co starałem się napisać poniżej wywołaniu :

manager.onPeersAvailable(myPeerListListener); 

ale otrzymuję ten błąd:

Sposób onPeersAvailable (WifiP2pManager.PeerListListener) nie jest zdefiniowana dla danego typu WifiP2pManager

Czy ktoś może mi powiedzieć jak mogę wysłać PeerListListener do głównej działalności prawidłowo?

Dziękuję bardzo za poświęcony czas

Odpowiedz

12

dtheo odpowiedział i wskazuje na ładny samouczek dotyczący Androida na ten temat. Wprowadzę tylko zmiany w kodzie OP, aby pokazać, jak osiągnąć żądane funkcje.

Według oficjalnego przewodnika Android here API wifip2p odkrycie powinno być używane w ten sposób:

W swojej klasie główną działalność:

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 

A w swojej klasie BroadcastReceiver, wykonaj następujące czynności zamiast:

@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 
    } 
} 
+0

Thx Zhang. Zaoszczędził mi czas. Twoje zdrowie. – greenspand

7

dtheo odpowiedział na pytanie.

Chciałbym tylko dodać małą notatkę: W przypadku Wi-Fi Direct oba urządzenia muszą być skanowane w tym samym czasie, aby się nawzajem odkryć. Istnieje również limit czasu skanowania, co oznacza, że ​​wykrywalność może zostać utracona po pewnym czasie.

Powiązane problemy