Android WIFI Как обнаружить, когда доступно специальное WIFI-соединение
Мне нужно определить, когда у меня есть сетевое подключение к сети SPECIFIC WIFI.
Например: как только вы войдете в свой дом, и ваш телефон заберет вашу домашнюю сеть WiFi, я хотел бы получить уведомление, в котором говорится: "Вы не в своей домашней сети, хотите ли вы подключиться к вам домой?" Но я хотел бы, чтобы это произошло только в моем конкретном доме.
Что мне следует слушать и какие тесты следует делать, чтобы убедиться, что это моя конкретная домашняя сеть, а не другая сеть?
Ответы
Ответ 1
Вы можете использовать BroadcastReceiver, чтобы узнать, что изменилась сеть Wi-Fi:
BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
context.registerReceiver(broadcastReceiver, intentFilter);
BroadcastReceiver может выглядеть так.
И чтобы проверить конкретный MAC-адрес, см. Метод checkConnectedToDesiredWifi() ниже.
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;
}
}
Ответ 2
До тех пор, пока нам не нужен код , для бесплатного обслуживания, я могу только порекомендовать вам, прочитать все возможности об Android и его возможностях Network/Wifi при создании такого приложения.
- Источники, которые вы должны прочитать и изучить.
http://developer.android.com/reference/android/net/wifi/package-summary.html
как узнать, подключен ли Wi-Fi в android
Как получить мой wifi hotspot ssid в моей текущей системе Android.
Как получить имя Wi-Fi-сети из Android с помощью API Android?
Получить имя интерфейса Wifi на 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" />
(последний, только если вы хотите, чтобы он обнаружил ваше местоположение, чтобы предотвратить ненужные вызовы)
- Вы также должны заявить, что ваше приложение должно иметь доступ к Wi-Fi для работы устройства:
AndroidManifest.xml
<uses-feature android:name="android.hardware.wifi" />
Ответ 3
Используйте стандартный код для отображения всех доступных сетей:
-
начать сканирование
String connectivity_context = Context.WIFI_SERVICE;
final WifiManager wifi = (WifiManager) getSystemService(connectivity_context);
if (wifi.isWifiEnabled()) {
wifi.startScan();
}
-
зарегистрировать приемник для данных
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);
В блоке FOR выполняйте свою магию и предпринимайте действия, когда вы идентифицируете свою сеть по SSID или BSSID
Ответ 4
У меня была точно такая же проблема для моего проекта и потребовалось некоторое время, чтобы найти решение.
Прежде всего, "подключение к WiFi" - это что-то очень абстрактное, и это получается правильно. На практике люди обычно означают следующее:
- с аутентификацией с точкой доступа WiFi.
- связанный с точкой доступа
- получил IP-адрес из сети.
Все эти этапы (и еще несколько) связаны с различными событиями Andoid. Итак, без лишнего шума, вот мой (слегка измененный) код:
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
}
Кроме того, не игнорируйте соответствующие разрешения для манифеста:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
И я сильно подозреваю, что вам также понадобятся:
<uses-permission android:name="android.permission.INTERNET"/>