android - 使用 BroadcastReceiver 在 Android 中获取断开连接的 WiFi 网络的 SSID?

标签 android android-wifi ssid

我有以下 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。

但我也希望能够在网络断开连接时获取 WiFi 网络的 SSID(无需存储以前连接的网络,然后以这种方式匹配它们等)。这可能吗?

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

但是,上述方法感觉不稳定,例如,如果由于某种原因错过了 WiFi 断开连接事件等

最佳答案

您绝对可以做到这一点,方法是使用与您尝试过的方法不同的方法。

  1. 你需要注册一个监听WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的接收器.
  2. 每当您进行 wifi 扫描时,都会使用扫描结果调用此接收器,在这些结果中您将拥有任何可用的路由器 ssid(无论其连接状态如何)
  3. 然后,您需要将您在代码中找到的断开连接的 wifi 与扫描列表相匹配。

将此权限添加到您的 list 中,并且不要忘记,如果您使用的是 marshmallow,request permission for the location .

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

关于android - 使用 BroadcastReceiver 在 Android 中获取断开连接的 WiFi 网络的 SSID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39678503/

相关文章:

java - 在另一个方法中从 AsyncTask 访问变量返回 null。如何仅在完成加载后才获取变量?

android - Application 子类中的静态变量。 (安卓)

Android Bitmap/Drawable mask

wifi - 扫描wifi结果重复SSID

android imageview 需要额外的黑色空间

android - 哪里可以找到WIFI Direct技术资料?

java - Android 3.2 和 WifiManager.setWifiEnabled

android - list 中声明的​​ BroadcastReceiver 未接收到广播

ios - 如何获取IOS设备当前链接的SSID

ios - 我可以在 iOS 上查看不同的 WiFi SSID 及其 channel 吗?