Android精选android系统控件安卓基础知识

Android开发之WIFI与网络连接处理

2017-05-01  本文已影响7599人  Reathin

网络连接处理

在说WiFi之前,先来说说网络连接处理。
在Android开发过程中,对于一个需要连接网络的Android设备,对设备的网络状态检测是很有必要的!有很多的App都需要连接网络。判断设备是否已经连接网络,并且在连接网络的状态下判断是wifi无线连接还是GPRS手机网络连接,这样就可以在不同的网络连接下去调用不同的方法,处理不同的事情。

现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是在访问网络之前,我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断,对应一些状态判断来做处理,并不是直接使用Http访问网络即可。很多人在开发就经常把网络这块直接跳过,直接访问网络,一旦断网,各种体验效果不好,不是说app没法用,只是体验效果差。还有,就是我们可能为用户考虑,因为现在一般连网是wifi和手机流量,都知道后者收费是比较高的。假如我们的app加载的图片或者有大的数据下载操作,可是用户的本意是要是在流量下的话就不要操作这些很费流量的的操作,这样就必须要我们做一些连网状态的判断。网络是否连接良好,连接的wifi还是流量,断网或者网络改变了的时候怎么做,这都是一些细节,但是要注意处理。

查看当前网络状态需要的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

允许查看当前网络状态,比如是3G还是WIFI上网。

连接管理

涉及的常用类

ConnectivityManager

翻译成中文即:网络连接管理者
主要作用:

获取ConnectivityManager

ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkInfo

翻译成中文即:网络的状态信息
获取NetworkInfo
通过ConnectivityManager获取

ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

主要方法:

注意:
1.当用wifi上的时候
getType是WIFI
getExtraInfo是空的

2.当用手机上的时候
getType是MOBILE

3.用移动CMNET方式
getExtraInfo的值是cmnet

4.用移动CMWAP方式
getExtraInfo的值是cmwap,但是不在代理的情况下访问普通的网站访问不了

5.用联通3gwap方式
getExtraInfo的值是3gwap

6.用联通3gnet方式
getExtraInfo的值是3gnet

7.用联通uniwap方式
getExtraInfo的值是uniwap

8.用联通uninet方式
getExtraInfo的值是uninet

TelephonyManager

TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。
需要添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

第一步,也要像ConnectivityManager一样获取管理器:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

常用方法:

网络连接处理方式

获取单个网络是否连接

贴代码:

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

通过广播获取连接状态改变(常用方式)

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() + "}");  
    }  
};  
<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);  

不同Rom可能不同。

下面来说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网卡状态

WifiInfo

wifi无线连接的信息,包括接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息

WifiInfo mWifiInfo=mWifiManager.getConnectionInfo();  

ScanResult

主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,
身份认证,频率,信号强度等信息。

开始扫描

mWifiManager.startScan()

得到扫描结果

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

锁定网络

手机屏幕关闭之后,并且其他的应用程序没有在使用wifi的时候,系统大概在两分钟之后,会关闭wifi,使得wifi处于睡眠状态,有利于电源能量的节省和延长电池寿命。

android为wifi提供了一种叫WifiLock的锁,能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态。这种锁,在下载一个较大的文件的时候,比较适合使用。

添加权限

<uses-permission android:name="android.permission.WAKE_LOCK"/>

创建wifiLock

方式1:

 // lockName为锁的名称
 WifiLock wifiLock = wifiManager.createWifiLock(lockName);  

方式2:

wifiLock = wifiManager.createWifiLock(lockType, lockName);  

lockType可以取以下值:

wifi添加锁

wifiLock.acquire();  

wifi释放锁

//判断wifi是否被lock锁持用
if (wifiLock.isHeld())  
{  
    // 释放锁
    wifiLock.release();  
}  

一般到了这个时候就该给个Demo了

ConnectivityManagerDemo:连接管理的Demo,里面带一个NetworkConnUtil(网络连接帮助类),Demo都是以log形式显示结果。懒得写界面啦 (*)4

WifiDemo: 里面带一个WifiUtil(Wifi连接帮助类)


Demo已上传:RairDemo
GitHub:https://github.com/Rairmmd/RairDemo
Coding:https://coding.net/u/Rair/p/RairDemo/git
上一篇 下一篇

猜你喜欢

热点阅读