设为首页 收藏本站
查看: 1337|回复: 0

[经验分享] 访问Android硬件资源の管理网络和Wifi连接

[复制链接]

尚未签到

发表于 2015-9-30 14:29:07 | 显示全部楼层 |阅读模式
  (1)ConnectivityManager
  在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取Connectivity Manager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下:
String cserviceName = Context.CONNECTIVITY_SERVICE;ConnectivityManager cm = (ConnectivityManager) getSystemService(cserviceName);要使用Connectivity Manager来读写网络状态时,需要在AndroidManifest.xml文件中加入如下的许可:<uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;/><uses-permission android:name=&quot;android.permission.CHANGE_NETWORK_STATE&quot;/>  Connectivity Manager在较高层面提供了管理可用网络连接的接口,使用getActiveNetworkInfo和getNetworkInfo函数可以查询获取NetworkInfo对象,该对象包含了当前活动网络连接或者指定类型的不可用网络连接的详细信息。
  1.1)设置首选网络
  当任何认证的应用程序请求网络连接时,Android都会优先尝试使用首选网络连接。设置首选网络连接的函数是setNetworkPreference,代码片段如下:
cm.setNetworkPreference(ConnectivityManager.TYPE_WIFI);  当首选网络连接不可用或者连接丢失时,Android将自动尝试使用第二优先连接类型。
  

  1.2)监控网络连接
  ConnectivityManager最常用的一个功能就是当网络连接状态改变时通知应用程序,这是通过应用程序实现自己的Broadcast Receiver来监听ConnectivityManager.CONNECTIVITY_ACTION类型的intent来实现的。这个intent提供了以下几种extra来进一步明确发生改变的网络状态:
  1)ConnectivityManager.EXTRA_IS_FAILOVER:&#20540;为true说明当前的连接是首选网络失效重连后的连接;
  2)ConnectivityManager.EXTRA_NO_CONNECTIVITY:&#20540;为true表示当前设备没有连接到网络;
  3)ConnectivityManager.EXTRA_REASON:如果当前的广播代表网络失效,则这个&#20540;包含了连接失效的原因描述;
  4)ConnectivityManager.EXTRA_NETWORK_INFO:返回NetworkInfo对象,包含了当前连接事件相关的网络详细信息;
  5)ConnectivityManager.EXTRA_OTHER_NETWORK_INFO:在一个网络断开连接时,这个&#20540;返回NetworkInfo对象,包含了可能的网络失效重连的详细信息;
  6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可选的网络连接的额外信息。
  

  (2)WifiManager
  WifiManager代表Android中的Wi-Fi连接服务,它被用于配置Wi-Fi网络连接,管理当前Wi-Fi连接,扫描Wi-Fi接入点和监控Wi-Fi连接的状态改变。获取WifiManager的方法和Connectivity Manager类&#20284;,通过函数getSystemService,并提供参数Context.WIFI_SERVICE,代码片段如下:
String wserviceName = Context.WIFI_SERVICE;WifiManager wm = (WifiManager) getSystemService(wserviceName);  同样的,需要在AndroidManifest.xml文件中指定访问许可:
<uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot;/><uses-permission android:name=&quot;android.permission.CHANGE_WIFI_STATE&quot;/>  我们可以使用setWifiEnabled函数来设置使能和去使能Wi-Fi硬件,使用getWifiState和isWifiEnabled函数来查看当前Wi-Fi状态,代码片段如下:
if (!wm.isWifiEnabled()) {if (WifiManager.WIFI_STATE_ENABLING != wm.getWifiState()) {wm.setWifiEnabled(true);}}  

  2.1)监控Wi-Fi连接
  在Wi-Fi网络连接状态改变时,Wi-Fi Manager将广播相应的intent,有如下几种:
  1)WifiManager.WIFI_STATE_CHANGED_ACTION:标识Wi-Fi硬件状态改变,可能在enabling、enabled、disabling、disabled和unknown之间改变。它包含了两个额外的键&#20540;EXTRA_WIFI_STATE和EXTRA_PREVIOUS_STATE,分别表示新的和前一个Wi-Fi状态。
  2)WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:Wi-Fi硬件和当前接入点之间的连接状态改变时,这个intent将被广播。额外的键&#20540;EXTRA_NEW_STATE用来表示是新的连接建立事件还是已存在的连接中断事件,为true表示新的连接建立。
  3)WifiManager.NETWORK_STATE_CHANGED_ACTION:Wi-Fi连接状态改变时广播这个intent,包含两个额外的键&#20540;:一是EXTRA_NETWORK_INFO,它包含表示当前网络状态的NetworkInfo对象;一是EXTRA_BSSID,包含连接到的接入点的BSSID&#20540;。
  4)WifiManager.RSSI_CHANGED_ACTION:监听这个intent可以使应用程序监控当前Wi-Fi连接的信号强度。包含一个额外键&#20540;EXTRA_NEW_RSSI,包含了当前信号强度。使用这个信号强度,需要使用静态函数calculateSignalLevel将这个&#20540;按指定的缩放转换为整型&#20540;。
  

  2.2)创建和管理Wi-Fi连接和配置
  使用WiFi Manager可以进行网络配置,控制连接到哪个网络。当连接建立后,可以进一步获取活动网络连接的额外配置信息。使用函数getConfiguredNetworks可获得当前网络配置信息的列表,返回&#20540;是WifiConfiguration对象,包含了网络ID、SSID和其他配置信息。
  要使用某一网络连接,可使用enableNetwork函数,传入网络ID并设置disableAllOthers参数为true即可,代码片段如下:
// Get a list of available configurationsList<WifiConfiguration> configurations = wm.getConfiguredNetworks();// Get the network ID for the first oneif (configurations.size() > 0) {int netID = configurations.get(0).networkId;// Enable the networkboolean disableAllOthers = true;wm.enableNetwork(netID, disableAllOthers);}  一旦连接建立,就可以使用getConnectionInfo函数来返回连接的状态,返回的是WifiInfo对象,包含了当前接入点的BSSID、Mac地址、IP地址,以及当前链路速度和信号强度。
  下面的代码片段用于查询当前活动Wi-Fi连接并显示获取的相关信息:
WifiInfo info = wm.getConnectionInfo();if (null != info.getBSSID()) {int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);int speed = info.getLinkSpeed();String units = WifiInfo.LINK_SPEED_UNITS;String ssid = info.getSSID();String toastText = String.format(&quot;Connected to {0} at {1}{2}. Strength {3}/5&quot;, ssid, speed, units, strength);Toast.makeText(this.getApplicationContext(), toastText, Toast.LENGTH_LONG);}  

  2.3)扫描Wifi热点
  我们可以使用startScan函数进行Wifi接入点的扫描,当扫描结束且结果可用时,WifiManager将发送SCAN_RESULTS_AVAILABLE_ACTIONL类型的intent。使用getScanResults函数可以获取扫描的结果信息,并保存中ScanResult对象中。ScanResult对象中存放了检测到的每个接入点的详细信息,包括链路速度、信号强度、SSID和支持的认证技术。下面代码片段显示了Wifi热点扫描的过程:
        // Register a broadcast receiver that listens for scan resultsregisterReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {List<ScanResult> results = wifi.getScanResults();ScanResult bestSignal = null;for (ScanResult result : results) {if (null == bestSignal ||WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) {bestSignal = result;}}String toastText = String.format(&quot;{0} networks found. {1} is the strongest.&quot;, results.size(), bestSignal.SSID);Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG);}}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));//Initiate a scanwifi.startScan();

  要连接到网络,需要创建和注册WiFi配置,通常用户可以使用Android系统原生的WiFi配置程序,但我们也可以在自己的应用程序中提供相同的功能,设置完全替代原生的WiFi配置程序,这就要用到保存网络配置信息的WifiConfiguration类了。每个WiFi配置一般都会包含以下几个公共的数据项:
  1)BSSID:指明接入点的BSSID;
  2)SSID:某一特定网络的SSID;
  3)networkId:用来唯一标识当前设备使用的网络配置的id;
  4)priority:选择连接哪个接入点时要使用的每个网络配置的优先权;
  5)status:当前网络连接的状态,取&#20540;如下:
  WifiConfiguration.Status.ENABLED,WifiConfiguration.Status.DISABLED,
  WifiConfiguration.Status.CURRENT。
  WifiConfiguration对象中还包括支持的认证技术以及用于与接入点进行认证的密钥。
  使用addNetwork函数可以将新的WiFi配置添加到当前WiFi列表中,类&#20284;的,updateNetwork函数可以用于更新某个已存在的WiFi配置的某些信息;removeNetwork函数用于移除配置信息。要保存网络配置的任何变化,需要调用saveConfiguration函数。


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121035-1-1.html 上篇帖子: iPhone wifi使用socket连接Internet 下篇帖子: WIFI模知识块的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表