Android检测网络是否可用并打开、扫描、连接WIFI

    xiaoxiao2021-03-25  104

    飞哥语录:一切都是最好的安排,如果不够好,说明还没到最好。

    需求:要求先检查网络是否可用,如果可用就跳过网络设置界面,如果不可用就打开WIFI并扫描网络后去手动输入密码连接

    1.添加权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><!-- 允许程序改变网络链接状态 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!--允许程序访问访问WIFI网络状态信息 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 允许程序改变WIFI链接状态 -->

    2.检查网络是否可用

    public boolean netWorkIsEnable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); try { // 通过ping百度检测网络是否可用 Process p = Runtime.getRuntime().exec("/system/bin/ping -c " + 1 + " 202.108.22.5"); int status = p.waitFor(); // 只有0时表示正常返回 return (connectivityManager.getActiveNetworkInfo() != null && status == 0); } catch (IOException e) { e.printStackTrace(); return false; } catch (InterruptedException e) { e.printStackTrace(); return false; } }

    3.检查WIFI是否打开,如果否,则打开WIFI

    private void initWifiState() { wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); } new Handler().postDelayed(new Runnable() { @Override public void run() { wifiManager.startScan(); scanResults = wifiManager.getScanResults(); if (scanResults != null && scanResults.size() > 0) { wifiListAdapter = new WifiListAdapter(mContext, scanResults); lvWifiSignal.setAdapter(wifiListAdapter); } else { Toast.makeText(InitSettingActivity.this, "没有搜索到可用网络", Toast.LENGTH_SHORT).show(); } } }, 6000); }

    解释一下上面为什么要用postDelayed,因为如果不用的话,我尝试了好多次,当wifi关闭的时候,然后会设置wifiManager.setWifiEnabled(true)即打开WIFI,然后紧接着去扫描网络会扫描不到的,因为打开wifi的动作是一个过程,是需要一些时间的,所以当6s之后去扫描肯定这时候WIFI已经打开了,所以就会扫描到结果的。

    4.实现连接指定的wifi

    private void toConnectWifi() { ScanResult result = scanResults.get(currentPosition); String ssid = result.SSID; String pwd = etWifiPwd.getText().toString().trim(); Log.e("TAG", "pwd=" + pwd); if (null == pwd || pwd.length() < 8) { Toast.makeText(InitSettingActivity.this, "密码至少为8位", Toast.LENGTH_SHORT).show(); return; } int wcgID = mWifiManager.addNetwork(CreateWifiInfo(ssid, pwd, 3)); boolean b = mWifiManager.enableNetwork(wcgID, true); } // 创建wifi配置对象 public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; WifiConfiguration tempConfig = this.IsExsits(SSID); if (tempConfig != null) { mWifiManager.removeNetwork(tempConfig.networkId); } if (Type == 1) //WIFICIPHER_NOPASS { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if (Type == 2) //WIFICIPHER_WEP { config.hiddenSSID = true; config.wepKeys[0] = "\"" + Password + "\""; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if (Type == 3) //WIFICIPHER_WPA { config.preSharedKey = "\"" + Password + "\""; 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.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; }

    5.监听网络连接状态的变化,便于当连接成功时我们做一些提示

    /** * 监听wifi状态变化的广播接收器 */ private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (wifiInfo.isConnected()) { WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); String wifiSSID = wifiManager.getConnectionInfo().getSSID(); llShow.setVisibility(View.GONE); tvToast1.setVisibility(View.VISIBLE); tvToast1.setText(R.string.init_door_equipment08); handler.sendEmptyMessageDelayed(1, 3000); } else if (wifiInfo.isConnectedOrConnecting()) { llShow.setVisibility(View.GONE); tvToast1.setVisibility(View.VISIBLE); tvToast1.setText(R.string.init_door_equipment05); } else if (wifiInfo.isFailover()) { llShow.setVisibility(View.GONE); tvToast1.setVisibility(View.VISIBLE); tvToast1.setText(R.string.init_door_equipment06); } } };

    6.初始化及解注册

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_init_setting); mContext = this; // 取得WifiManager对象 mWifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); // 取得WifiInfo对象 mWifiInfo = mWifiManager.getConnectionInfo(); IntentFilter filter = new IntentFilter( WifiManager.NETWORK_STATE_CHANGED_ACTION); registerReceiver(mReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); }

    这样最基本的打开、扫描、连接、通知功能就实现了。

    希望对大家能有所帮助。

    转载请注明原文地址: https://ju.6miu.com/read-14898.html

    最新回复(0)