前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android检测网络是否可用并打开、扫描、连接WIFI

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

作者头像
程序员飞飞
发布2020-02-27 16:57:17
2.7K0
发布2020-02-27 16:57:17
举报
文章被收录于专栏:Android&Java技术Android&Java技术

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

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

1.添加权限

代码语言:javascript
复制
<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.检查网络是否可用

代码语言:javascript
复制
    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

代码语言:javascript
复制
	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

代码语言:javascript
复制
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.监听网络连接状态的变化,便于当连接成功时我们做一些提示

代码语言:javascript
复制
/**
     * 监听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.初始化及解注册

代码语言:javascript
复制
@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);
    }

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

希望对大家能有所帮助。。。

本文首发于我的微信公众号,更多干货文章,请扫描二维码订阅哦:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android检测网络是否可用并打开、扫描、连接WIFI
    • 1.添加权限
      • 2.检查网络是否可用
        • 3.检查WIFI是否打开,如果否,则打开WIFI
          • 4.实现连接指定的wifi
            • 5.监听网络连接状态的变化,便于当连接成功时我们做一些提示
              • 6.初始化及解注册
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档