「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」
网络连接处理方式
获取单个网络是否连接
贴代码:
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//WiFi是否连接
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
boolean isWifiConn = networkInfo.isConnected();
//手机网络是否连接
networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileConn = networkInfo.isConnected();
获取网络是否连接
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
通过广播获取连接状态改变(常用方式)
- 注册广播,监听ConnectivityManager.CONNECTIVITY_ACTION频道
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(mReceiver, filter);
- 网络状态广播
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) {
Log.i(TAG, "netWork has lost");
}
NetworkInfo tmpInfo = (NetworkInfo)
intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
Log.i(TAG, tmpInfo.toString() + " {isConnected = " + tmpInfo.isConnected() + "}");
}
};
- 清单文件注册(Demo写内部类了)
<receiver android:name=".ConnectionReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
无网络连接处理
提示无网络,或跳转到网络设置界面:
/**
* 判断手机系统的版本!如果API大于10 就是3.0+
* 因为3.0以上的版本的设置和3.0以下的设置不一样,调用的方法不同
*/
Intent intent ;
if (Build.VERSION.SDK_INT > 10) {
intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
} else {
intent = new Intent();
ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
intent.setComponent(component);
intent.setAction("android.intent.action.VIEW");
}
startActivity(intent);
下面来说WiFi
WiFi
WIFI是一种无线联网技术,常见的是使用无线路由器,在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。
首先,要操作WiFi,先要加入权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Android中对于Wifi操作本身提供了一些有用的包android.net.wifi
WiFi常用相关类
WifiManager用来管理我们的wifi连接
取得WifiManager对象
WifiManager mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
打开wifi
if(!mWifiManager.isWifiEnabled())
{
mWifiManager.setWifiEnabled(true);
}
关闭wifi
if(mWifiManager.isWifiEnabled())
{
mWifiManager.setWifiEnabled(false);
}
检查当前wifi状态
mWifiManager.getWifiState()
WIFI网卡状态
- WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
- WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
- WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)
- WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)
- WifiManager.WIFI_STATE_UNKNOWN : 未知网卡状态
WifiInfo
wifi无线连接的信息,包括接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息
WifiInfo mWifiInfo=mWifiManager.getConnectionInfo();
- getBSSID() 获取BSSID,在手机WIFI中,就是MAC地址
- getSSID() 获取SSID
- getDetailedStateOf() 获取客户端的连通性
- getHiddenSSID() 获得SSID是否被隐藏
- getIpAddress() 获取IP地址
- getLinkSpeed() 获得连接的速度
- getMacAddress() 获得Mac地址
- getRssi() 获得802.11n网络的信号
- getSupplicanState() 返回具体客户端状态的信息
ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称, 身份认证,频率,信号强度等信息。
开始扫描
mWifiManager.startScan()
mWifiManager.enableNetwork(wcnetworkid,true);
得到扫描结果
List<ScanResult> mWifiList=mWifiManager.getScanResults();
WifiConfiguration
Wifi网络的配置,包括安全设置等。
得到配置好的网络连接
List<WifiConfiguration> mWifiConfigurations=mWifiManager.getConfiguredNetworks()
连接配置好指定ID的网络
mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true)
处理网络
动态处理WiFi网络
//添加一个网络并连接
public void addNetWork(WifiConfiguration configuration){
int wcgId=mWifiManager.addNetwork(configuration);
mWifiManager.enableNetwork(wcgId, true);
}
//断开指定ID的网络
public void disConnectionWifi(int netId){
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
连接到对应WiFi网络
创建WifiConfiguration配置对象
String ssid = "Rair";
String pwd = "88888888";
WifiConfiguration localWifiConfiguration = new WifiConfiguration();
//公认的IEEE 802.11验证算法。
localWifiConfiguration.allowedAuthAlgorithms.clear();
localWifiConfiguration.allowedAuthAlgorithms.set(0);
//公认的的公共组密码。
localWifiConfiguration.allowedGroupCiphers.clear();
localWifiConfiguration.allowedGroupCiphers.set(2);
//公认的密钥管理方案。
localWifiConfiguration.allowedKeyManagement.clear();
localWifiConfiguration.allowedKeyManagement.set(1);
//密码为WPA。
localWifiConfiguration.allowedPairwiseCiphers.clear();
localWifiConfiguration.allowedPairwiseCiphers.set(1);
localWifiConfiguration.allowedPairwiseCiphers.set(2);
//公认的安全协议。
localWifiConfiguration.allowedProtocols.clear();
localWifiConfiguration.SSID = (""" + ssid + """);
localWifiConfiguration.preSharedKey = (""" + pwd + """);
//不广播其SSID的网络
localWifiConfiguration.hiddenSSID = true;
WifiConfiguration对应的配置值可到文档中查看,不知道怎么翻译描述。O(∩_∩)O~
添加WIFI网络
wcnetworkid = mWifiManager.addNetwork(localWifiConfiguration);
使WIFI网络有效
mWifiManager.enableNetwork(wcnetworkid,true);