这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中”位置信息“) WifiManager和LocationManager都需要获取下系统服务
mWifiManager = (WifiManager) getActivity().getSystemService(getActivity().WIFI_SERVICE); locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);这里LocationManager是为了判断手机有没有打开这个“位置信息” 好的,前戏已经准备好了,接下来就是正轨了…
监听WiFi的广播接收器是必不可少的 public class WifiBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) { //wifi开关变化 int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); switch (state) { case WifiManager.WIFI_STATE_DISABLED: { //wifi关闭 Log.i(TAG, "已经关闭"); break; } case WifiManager.WIFI_STATE_DISABLING: { //wifi正在关闭 Log.i(TAG, "正在关闭"); break; } case WifiManager.WIFI_STATE_ENABLED: { //wifi已经打开 Log.i(TAG, "WIFI已打开"); break; } case WifiManager.WIFI_STATE_ENABLING: { //wifi正在打开 Log.i(TAG, "正在打开"); break; } case WifiManager.WIFI_STATE_UNKNOWN: { //未知 Log.i(TAG, "未知状态"); break; } } } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) { //监听wifi连接状态 NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); // Log.i(TAG, "--NetworkInfo--" + info.toString()); if (NetworkInfo.State.DISCONNECTED == info.getState()) {//wifi没连接上 Log.i(TAG, "wifi没连接上"); } else if (NetworkInfo.State.CONNECTED == info.getState()) {//wifi连接上了 mScanResultList = MyWifiManager.getWifiList(mWifiManager);//获取Wifi列表 for (int i = 0; i < mScanResultList.size(); i++) { mScanResultList.get(i).SSID//Wifi名称 mScanResultList.get(i).level//wifi信号强度 //其他就不列举了,根据自己的需求去取 //在这增加一个获取当前已连接WiFi的名称以及信号强度 WifiInfo wifiInfo = mWifiManager .getConnectionInfo(); String name = wifiInfo.getSSID();//名称 WifiInfo wifiInfo = manager.getConnectionInfo(); int wiFiLevel = wifiInfo.getRssi();//信号强度 } } else if (NetworkInfo.State.CONNECTING == info.getState()) {//正在连接 Log.i(TAG, "wifi正在连接"); tvConnectionCtatus.setText("正在连接"); } } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) { //监听wifi列表变化 Log.i(TAG, "wifi列表发生变化"); } } }广播到这就结束了,后面我会封装一个WifiManager工具类。咱继续哈 2. 注册广播(这里选择是动态注册)
wifiReceiver = new WifiBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//监听wifi是开关变化的状态 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//监听wifi连接状态 filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//监听wifi列表变化(开启一个热点或者关闭一个热点) registerReceiver(wifiReceiver, filter);记得要unregistered(receiver); 3. 最后把封装的WifiManager工具给大家贴出来
/** * 开始扫描wifi */ public static void startScanWifi(WifiManager manager) { if (manager != null) { manager.startScan(); } } /** * 获取wifi列表 */ public static List<ScanResult> getWifiList(WifiManager mWifiManager) { return mWifiManager.getScanResults(); } /** * 保存网络 */ public static void saveNetworkByConfig(WifiManager manager, WifiConfiguration config) { if (manager == null) { return; } try { Method save = manager.getClass().getDeclaredMethod("save", WifiConfiguration.class, Class.forName("android.net.wifi.WifiManager$ActionListener")); if (save != null) { save.setAccessible(true); save.invoke(manager, config, null); } } catch (Exception e) { e.printStackTrace(); } } /** * 断开连接 */ public static boolean disconnectNetwork(WifiManager manager) { return manager != null && manager.disconnect(); } /** * 获取当前wifi名字 * * @return */ public static String getWiFiName(WifiManager manager) { WifiInfo wifiInfo = manager.getConnectionInfo(); String name = wifiInfo.getSSID(); return name.replace("\"", ""); } /** * 获取当前WIFI信号强度 * * @param manager * @return */ public static int getWiFiLevel(WifiManager manager) { WifiInfo wifiInfo = manager.getConnectionInfo(); return wifiInfo.getRssi(); } /** * 获取wifi加密方式 */ public static String getEncrypt(WifiManager mWifiManager, ScanResult scanResult) { if (mWifiManager != null) { String capabilities = scanResult.capabilities; if (!TextUtils.isEmpty(capabilities)) { if (capabilities.contains("WPA") || capabilities.contains("wpa")) { return "WPA"; } else if (capabilities.contains("WEP") || capabilities.contains("wep")) { return "WEP"; } else { return "没密码"; } } } return "获取失败"; } /** * 是否开启wifi,没有的话打开wifi */ public static void openWifi(WifiManager mWifiManager) { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); } } /** * 是否开启wifi,没有的话打开wifi */ public static void closeWifi(WifiManager mWifiManager) { mWifiManager.setWifiEnabled(false); } /** * 有密码连接 * * @param ssid * @param pws */ public static void connectWifiPws(WifiManager mWifiManager, String ssid, String pws) { mWifiManager.disableNetwork(mWifiManager.getConnectionInfo().getNetworkId()); int netId = mWifiManager.addNetwork(getWifiConfig(mWifiManager, ssid, pws, true)); mWifiManager.enableNetwork(netId, true); } /** * wifi设置 * * @param ssid * @param pws * @param isHasPws */ private static WifiConfiguration getWifiConfig(WifiManager mWifiManager, String ssid, String pws, boolean isHasPws) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + ssid + "\""; WifiConfiguration tempConfig = isExist(ssid, mWifiManager); if (tempConfig != null) { mWifiManager.removeNetwork(tempConfig.networkId); } if (isHasPws) { config.preSharedKey = "\"" + pws + "\""; config.hiddenSSID = true; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } else { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } return config; } /** * 得到配置好的网络连接 * * @param ssid * @return */ private static WifiConfiguration isExist(String ssid, WifiManager mWifiManager) { List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration config : configs) { if (config.SSID.equals("\"" + ssid + "\"")) { return config; } } return null; }当然最少不了的权限,6.0以后啊都是需要动态获取权限的,相信都会吧 下一篇博客就会写到动态获取权限,是一个封装好的工具类,使用起来非常方便,举个例子
第二个参数就是app需要进行检测的权限数组 PermissUtil.checkPermissions(this, PermissUtil.appNeedPermissions);有不妥之处还请大家多多指教,谢谢!(持续关注哦)