Je dois détecter quand j'ai une 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 détecte votre réseau Wi-Fi domestique, je voudrais une notification qui dit "Vous n'êtes pas sur votre réseau domestique, souhaitez-vous vous connecter à votre domicile?" Mais j'aimerais que cela ne se produise que lorsque je suis chez moi.
Que dois-je écouter et quels tests dois-je faire pour m'assurer qu'il s'agit bien de mon réseau domestique spécifique, et non d'un autre réseau?
Vous pouvez utiliser BroadcastReceiver pour découvrir 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);
Le BroadcastReceiver peut ressembler à ceci. Et pour vérifier l'adresse MAC spécifique, voir la méthode checkConnectedToDesiredWifi () 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 nous n'avons rien à voir avec le code dont vous avez besoin, pour un service gratuit , je ne peux que vous recommander, de lire tout ce qui est possible sur Android et ses possibilités de réseau/Wifi, lors de la création d'une telle application.
http://developer.Android.com/reference/Android/net/wifi/package-summary.html
comment voir si le wifi est connecté dans Android
Comment obtenir mon SSID de hotspot wifi dans mon actuel Android
Comment obtenir le nom du réseau wifi hors de Android en utilisant Android API?
Obtenir le nom de l'interface Wifi sur Android
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" />
( le dernier, seulement si vous voulez qu'il détecte votre position, pour éviter les appels inutiles)
AndroidManifest.xml
<uses-feature Android:name="Android.hardware.wifi" />
Utilisez le code standard pour répertorier tous les réseaux disponibles:
lancer 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 FOR, travaillez votre magie et agissez lorsque vous identifiez votre réseau par SSID ou BSSID
J'ai eu exactement le même problème pour un de mes projets et j'ai mis du temps à trouver une solution.
Tout d'abord, "se connecter à un WiFi" est quelque chose de très abstrait, et cela se révèle à juste titre. Dans la pratique, les gens signifient généralement tout ce qui suit:
Toutes ces étapes (et plusieurs autres) sont associées à différents événements andoïdes. Alors, sans plus tarder, 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
}
Ne négligez pas non plus les autorisations appropriées sur le 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 également besoin de:
<uses-permission Android:name="Android.permission.INTERNET"/>