Android WIFI Comment détecter quand une connexion WIFI spécifique est disponible
je dois détecter quand j'ai la connectivité réseau à un réseau WIFI spécifique.
par exemple: dès que vous entrez dans votre maison et que votre téléphone capte le réseau WiFi de votre domicile, je voudrais recevoir une notification disant: "Vous n'êtes pas sur votre réseau domestique, voulez-vous vous connecter à votre domicile?"Mais je voudrais que cela n'arrive que lorsque je suis dans ma maison spécifique.
Que dois-je écouter et quels tests dois-je faire pour vous assurer qu'il est-ce que mon réseau domestique est spécifique, et pas un autre réseau?
4 réponses
vous pouvez utiliser BroadcastReceiver pour savoir que le réseau wifi a changé:
BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
context.registerReceiver(broadcastReceiver, intentFilter);
L'émetteur peut ressembler à ça. Et pour vérifier l'adresse MAC spécifique, voir la méthode checkconnectedodesiredwifi () ci-dessous.
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) {
SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
if (SupplicantState.isValidState(state)
&& state == SupplicantState.COMPLETED) {
boolean connected = checkConnectedToDesiredWifi();
}
}
}
/** Detect you are connected to a specific network. */
private boolean checkConnectedToDesiredWifi() {
boolean connected = false;
String desiredMacAddress = "router mac address";
WifiManager wifiManager =
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifi = wifiManager.getConnectionInfo();
if (wifi != null) {
// get current router Mac address
String bssid = wifi.getBSSID();
connected = desiredMacAddress.equals(bssid);
}
return connected;
}
}
tant que, comme nous ne sommes rien comme code que vous avez besoin, pour le service gratuit , Je ne peux que vous recommander, de lire tout ce qui est possible sur Android et ses possibilités réseau/Wifi, lors de la création d'une telle application.
- Sources, vous devez lire et étudier
http://developer.android.com/reference/android/net/wifi/package-summary.html
comment voir si wifi est connecté à android
comment obtenir mon SSID hotspot wifi dans mon système android actuel
Comment obtenir le nom de wifi-réseau hors d'android en utilisant L'API android?
obtenir le nom de L'Interface Wifi sur Android
- Permissions que vous devez demander lors de la création de l'application manifeste
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
( la dernière, seulement si vous le voulez afin de détecter votre emplacement, pour éviter les appels inutiles )
- vous devez également déclarer, que votre application a besoin wifi pour être disponible dans l'appareil, pour fonctionner correctement:
AndroidManifest.xml
<uses-feature android:name="android.hardware.wifi" />
utilisez le code standard pour lister tous les réseaux disponibles:
-
démarrer l'analyse
String connectivity_context = Context.WIFI_SERVICE; final WifiManager wifi = (WifiManager) getSystemService(connectivity_context); if (wifi.isWifiEnabled()) { wifi.startScan(); }
-
enregistrer un récepteur pour les données
IntentFilter i = new IntentFilter(); i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent i) { // TODO Auto-generated method stub ScanWiFiActivity a = ScanWiFiActivity.instance(); WifiManager w = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); List<ScanResult> l = w.getScanResults(); a.Clear(); for (ScanResult r : l) { //use r.SSID or r.BSSID to identify your home network and take action a.setText(r.SSID + "" + r.level + "\r\n"); } } }; registerReceiver(receiver, i);
Dans le bloc de travailler votre magie et de prendre des mesures lorsque vous vous identifiez à votre réseau par le SSID ou le BSSID
j'ai eu exactement le même problème pour un de mes projets et il a fallu un certain temps pour trouver une solution.
tout d'abord," se connecter à un WiFi " est quelque chose de très abstrait, et il s'avère à juste titre. Dans la pratique, les gens signifient habituellement tout ce qui suit:
- authentifié avec un point D'accès WiFi
- associé au point d'accès
- a obtenu une adresse ip du réseau
tous ces stades (et plusieurs autres) sont associés à différents événements Andoïdes. Donc, sans plus attendre, voici mon code (légèrement modifié):
public class MyService extends Activity { // or Service
//... Other stuff
BroadcastReceiver awaitIPAddress = null;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) {
//WiFi is associated
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
// Wifi info available (should be, we are associated)
if (wi.getIpAddress() != 0) {
// Lucky us, we already have an ip address.
// This happens when a connection is complete, e.g. after rekeying
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
} else {
// No ip address yet, we need to wait...
// Battery friendly method, using events
if (awaitIPAddress == null) {
awaitIPAddress = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent in) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
if (wi.getIpAddress() != 0) {
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
}
} else {
ctx.unregisterReceiver(this);
awaitIPAddress = null;
}
}
};
// We register a new receiver for connectivity events
// (getting a new IP address for example)
context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
}
}
} else {
// wifi connection not complete, release ip address receiver if registered
if (awaitIPAddress != null) {
context.unregisterReceiver(awaitIPAddress);
awaitIPAddress = null;
}
}
}
}
};
//... Other stuff
@Override
public void onCreate() {
super.onCreate();
//... Other stuff
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
registerReceiver(receiver, filter);
//... Other stuff
}
//... Other stuff
}
aussi, ne négligez pas les permissions appropriées au manifeste:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
et je soupçonne fortement que vous aurez besoin aussi:
<uses-permission android:name="android.permission.INTERNET"/>