Android WIFI与网络连接处理(三)

1,292 阅读3分钟

「这是我参与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,先要加入权限

image.png

<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);