2017-03-29 1 views
0

Je n'ai aucune expérience dans le développement d'applications et je suis maintenant supposé créer une application dans un studio Android qui se connecte à un capteur par WiFi-direct. J'ai lu sur WiFi-direct et essayé de suivre les guides https://developer.android.com/guide/topics/connectivity/wifip2p.html et https://stuff.mit.edu/afs/sipb/project/android/docs/training/connect-devices-wirelessly/wifi-direct.html mais en utilisant leur code, je n'ai toujours aucune idée de la façon d'avancer. J'ai également regardé plusieurs applications de démonstration pour le WiFi direct.Comment créer un bouton qui démarre WiFi direct

Mon code ressemble à ceci pour le moment.

Diffusion recepteur:

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver { 

private WifiP2pManager mManager; 
private WifiP2pManager.Channel mChannel; 
private MainActivity mActivity; 

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel, 
            MainActivity activity) { 
    super(); 
    this.mManager = manager; 
    this.mChannel = channel; 
    this.mActivity = activity; 
} 

@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) { 
      mActivity.setIsWifiP2pEnabled(true); 
     } else { 
      mActivity.setIsWifiP2pEnabled(false); 
     } 

    } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
     // Call WifiP2pManager.requestPeers() to get a list of current peers 
    } 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 
    } 
} 
} 

MainActivity:

public class MainActivity extends AppCompatActivity { 

WifiP2pManager mManager; 
WifiP2pManager.Channel mChannel; 
private boolean isWifiP2pEnabled = false; 
BroadcastReceiver mReceiver; 
IntentFilter mIntentFilter; 


public void setIsWifiP2pEnabled(boolean isWifiP2pEnabled) { 
    this.isWifiP2pEnabled = isWifiP2pEnabled; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    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); 


    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
    mChannel = mManager.initialize(this, getMainLooper(), null); 
    mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this); 

} 

/* register the broadcast receiver with the intent values to be matched */ 
@Override 
protected void onResume() { 
    super.onResume(); 
    mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this); 
    registerReceiver(mReceiver, mIntentFilter); 
} 
/* unregister the broadcast receiver */ 
@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mReceiver); 
} 



} 

La partie suivante du guide est que je devrais essayer de découvrir leurs pairs. Où dois-je implémenter ce code?

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 

    @Override 
    public void onSuccess() { 
     // Code for when the discovery initiation is successful goes here. 
     // No services have actually been discovered yet, so this method 
     // can often be left blank. Code for peer discovery goes in the 
     // onReceive method, detailed below. 
    } 

    @Override 
    public void onFailure(int reasonCode) { 
     // Code for when the discovery initiation fails goes here. 
     // Alert the user that something went wrong. 
    } 
}); 

Mon produit final devrait être un bouton que quand je le presse je cherche pour les pairs et être capable de se connecter à un. Le capteur démarrera en WiFi directement. Est-ce que quelqu'un sait où je peux trouver plus d'informations sur la façon de procéder ou avoir des conseils sur les classes dont j'ai besoin et autres?

Merci!

Répondre

0

La façon dont cela fonctionne est par:

  • Appel discoverPeers lorsque vous tapez sur le bouton
  • Ensuite, dans votre WiFiDirectBroadcastReceiver ->WIFI_P2P_PEERS_CHANGED_ACTION condition, demander la liste des pairs disponibles comme ceci: mManager.requestPeers(mChannel, peerListListener);
  • Ensuite, vous devez implémenter WifiP2pManager.PeerListListener dans votre activité ou fragment car les homologues découverts retourneront dans cette méthode:

    @Override public void onPeersAvailable(WifiP2pDeviceList peerList) {}

  • Une fois que vous avez la liste des pairs, vous pouvez vous connecter à un pair en utilisant mManager.connect(mChannel, config, new ActionListener() {});

Je crois suivais https://developer.android.com/guide/topics/connectivity/wifip2p.html est assez bon pour faire fonctionner l'api.

Goodluck.

+0

merci! Dois-je demander la liste des pairs dans la méthode OnRecieve ou créer une méthode séparée comme "public void DiscoverPeers()" ou quelque chose? – user7772159

+0

Oui, dans le "OnReceive" où le commentaire dit requestPeers -> else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals (action)) { // Appelez WifiP2pManager.requestPeers() pour obtenir une liste des pairs actuels } – JAD