Android检测网络是否可用并打开、扫描、连接WIFI
2017-03-09 19:15
555 查看
Android检测网络是否可用并打开、扫描、连接WIFI
需求:要求先检查网络是否可用,如果可用就跳过网络设置界面,如果不可用就打开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); }
这样最基本的打开、扫描、连接、通知功能就实现了…
希望对大家能有所帮助。。。
相关文章推荐
- Android判断网络连接是否可用,WiFi、移动数据是否打开等
- Android检测手机是否有网络连接可用
- android 检测网络是否连接,或者GPS是否可用
- Android检测手机是否有网络连接可用
- android检测wifi是否打开或连接及设置自动打开
- Android 判断当前网络连接是否可用、打开设置网络界面
- android检测网络是否连接,WIFI是否连接
- Android 检测网络连接是否可用
- android中判断网络连接是否可用 2g、3g、wifi
- android中判断网络连接是否可用
- android 检测网络是否连接
- Android检测网络状态,判断当前网络是否可用
- 开启Android程序时检测网络与GPS是否打开
- Android中判断网络连接是否可用及监控网络状态
- Android下检测网络连接 3G WIFI
- android检测当前网络是否可用
- Android 检测当前网络是否可用
- C#快速检测是否有可用的网络连接存在
- ANDROID中判断网络连接是否可用
- WindowMobile如何判断网络有没连接和如何判WebService服务器地址是否正确(wifi有无打开)