Intereting Posts
Выберите заднюю камеру на устройстве Android – jsartoolkit5 Попытка создать простое уведомление в android Необходимо перенести файл .apk с помощью webservice API Карт Google V2 – всегда получать ошибку аутентификации Android-непоследовательная анимация на разных устройствах Приложение в режиме киоска на андроиде Как получить строку из разных локалей в Android? Это ошибка или функция? В некоторых случаях можно получить доступ к потоку пользовательского интерфейса из задачи, не выполняемой в потоке пользовательского интерфейса Apache MINA против netty для Android Android – передача объекта JSON из webview javascript в java Приложение занимает слишком много времени для запуска Как настроить Eclipse для использования Phonegap на Ubuntu? Подключите два устройства Android, используя программный пакет bluetooth AsyncTask внутри статического метода – хорошая практика кодирования? Android ListView и ArrayAdapter / Arraylist

Получить SSID отключенной Wi-Fi сети в Android с помощью BroadcastReceiver?

У меня есть следующее BroadcastRecevier:

public class WiFiConnectionEventsReceiver extends BroadcastReceiver { private static final String TAG = WiFiConnectionEventsReceiver.class.getSimpleName(); @Override public void onReceive(Context context, @NonNull Intent intent) { Log.v(TAG, "action: " + intent.getAction()); Log.v(TAG, "component: " + intent.getComponent()); Bundle extras = intent.getExtras(); if (extras != null) { for (String key : extras.keySet()) { Log.v(TAG, "key [" + key + "]: " + extras.get(key)); } } else { Log.v(TAG, "no extras"); } ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = conMan.getActiveNetworkInfo(); if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) { Log.d("NetworkInfo", "Have Wifi Connection"); Log.d("NetworkInfo", netInfo.getExtraInfo()); Log.d("NetworkInfo", netInfo.getTypeName()); } else { Log.d("NetworkInfo", "Don't have Wifi Connection"); Log.d("NetworkInfo", netInfo.getExtraInfo()); Log.d("NetworkInfo", netInfo.getTypeName()); } WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); Log.d("WifiInfo", wifiManager.getConnectionInfo().toString()); } } 

Он получает события сетевого подключения и отключения.

Когда он подключается к сети WiFi, я могу легко получить SSID сети.

Но я хочу получить SSID сети WiFi, когда сеть отключена (без необходимости хранить ранее подключенные сети, а затем сопоставлять их таким образом и т. Д.). Это возможно?

Журналы при подключении WiFi:

 V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "SKY123”, roaming: false, failover: false, isAvailable: true] V/WiFiConnectionEventsReceiver: key [networkType]: 1 V/WiFiConnectionEventsReceiver: key [inetCondition]: 100 V/WiFiConnectionEventsReceiver: key [extraInfo]: "SKY123” D/NetworkInfo: Have Wifi Connection D/NetworkInfo: "SKY123” D/NetworkInfo: WIFI D/WifiInfo: SSID: SKY123, BSSID: 10:40:03:ad:6x:c9, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -79, Link speed: 43Mbps, Frequency: 2412MHz, Net ID: 1, Metered hint: false, score: 60 

Журналы, когда WiFi отключается (обратите внимание на неизвестный SSID):

 V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: <unknown ssid>, roaming: false, failover: false, isAvailable: true] V/WiFiConnectionEventsReceiver: key [networkType]: 1 V/WiFiConnectionEventsReceiver: key [inetCondition]: 0 V/WiFiConnectionEventsReceiver: key [extraInfo]: <unknown ssid> V/WiFiConnectionEventsReceiver: key [noConnectivity]: true D/NetworkInfo: Don't have Wifi Connection D/NetworkInfo: id D/NetworkInfo: MOBILE D/WifiInfo: SSID: <unknown ssid>, BSSID: <none>, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -127, Link speed: -1Mbps, Frequency: -1MHz, Net ID: -1, Metered hint: false, score: 0 

Причина, по которой мне нужна эта информация, – это то, что я хочу отслеживать использование WiFi пользователя в каждой сети – время соединения и отключения.

Без SSID отключенной сети, единственный способ, которым я могу это сделать, – это что-то вроде:

 if (WiFi network ABC disconnected) if (if previous stored connection for WiFi network ABC has no disconnection time) set WiFI network ABC disconnection time to now 

Тем не менее, вышеупомянутый подход кажется flaky, например, что если по какой-то причине событие отключения Wi-Fi пропущено и т. Д.

    Вы можете определенно сделать это, используя другой подход, чем то, что вы пробовали.

    1. Вам необходимо зарегистрировать приемник, который прослушивает WifiManager.SCAN_RESULTS_AVAILABLE_ACTION .
    2. Всякий раз, когда вы выполняете проверку Wi-Fi, этот приемник будет вызываться с результатами сканирования, в рамках этих результатов у вас будет любой доступный ssid маршрутизатора (независимо от его состояния соединения)
    3. Затем вам нужно сопоставить отключенный Wi-Fi, который вы нашли в своем коде, со списком сканирования.

    Добавьте эти разрешения в свой манифест и не забывайте, что если вы используете зефир, запросите разрешение на местоположение .

     <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_COARSE_LOCATION" /> 

    Это MainActivty, результаты получены на широковещательном приемнике.

     public class MainActivity extends AppCompatActivity { private WifiManager mWifiManager; private List<ScanResult> mScanResults; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); if (mWifiManager.isWifiEnabled() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && mWifiManager.isScanAlwaysAvailable())) { registerReceiver(mReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); } } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { mScanResults = mWifiManager.getScanResults(); for (ScanResult result : mScanResults) { Log.i(getClass().getSimpleName(), "wifi Ssid : " + result.SSID); } } } }; @Override protected void onDestroy() { try { unregisterReceiver(mReceiver); } catch (Exception e) { e.printStackTrace(); } super.onDestroy(); } } 

    Это невозможно. Когда onReceive называется, соединение уже потеряно, и текущая информация показывает, что соединение отсутствует.

    Также обратите внимание, что вы можете получить еще один вызов onRecieve сразу после получения информации о разъединении. Из спецификации :

    CONNECTIVITY_ACTION

    […]

    Если это соединение, которое было результатом отказа от отключенной сети, то для FAILOVER_CONNECTION boolean extra установлено значение true.

    Для потери возможности подключения, если диспетчер подключений пытается подключиться (или уже подключен) к другой сети, NetworkInfo для новой сети также передается как дополнительная. Это позволяет любым приемникам широковещательной передачи знать, что они не обязательно должны сообщать пользователю, что никакой трафик данных не будет возможен. Вместо этого приемник должен ожидать очередную широковещательную рассылку в ближайшее время, указывая либо на то, что попытка восстановления после отказа удалась (и, следовательно, все еще есть общая возможность подключения к данным), либо что неудачная попытка отказа не удалась, а это означает, что все соединения были потеряны.

    […]

    Как только соединение потеряно, оно потеряно.

    Единственный способ, которым вы могли это сделать, – это зарегистрировать его в тот момент или сохранить его с помощью чего-то вроде общих настроек, чтобы вы могли получить имя последнего подключенного Wi-Fi.

    Использование предложения здесь не гарантирует, что вы видите последний подключенный Wi-Fi, так как нет гарантии, что Wi-Fi все еще доступен, особенно если соединение было потеряно.