您的位置:首页 > 理论基础 > 计算机网络

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