访问Android硬件资源及管理网络和Wifi连接

Android Connectivity分析(2)- ConnectivityService ConnectivityService 描述 Connectivity的核心部分,对ConnectivityManager的实现,实现了IConnectivityManager接口。 在SystemServer的init2中进行初始化,并增加到ServiceManager中。 构造方法 创建单独的thread,进行handler消息处理 创建NetworkFactory 阅读详情

在Android中要管理到网络连接及配置各种参数,其中用到的各种函数和类总结如下:

一、ConnectivityManager

在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取Connectivity Manager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下:


[java]
String cserviceName = Context.CONNECTIVITY_SERVICE;  
ConnectivityManager cm = (ConnectivityManager) getSystemService(cserviceName);  
要使用Connectivity Manager来读写网络状态时,需要在AndroidManifest.xml文件中加入如下的许可:
[html]
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>  
Connectivity Manager在较高层面提供了管理可用网络连接的接口,使用getActiveNetworkInfo和getNetworkInfo函数可以查询获取NetworkInfo对象,该对象包含了当前活动网络连接或者指定类型的不可用网络连接的详细信息。


1.1 设置首选网络



当任何认证的应用程序请求网络连接时,Android都会优先尝试使用首选网络连接。设置首选网络连接的函数是setNetworkPreference,代码片段如下:


[java]
cm.setNetworkPreference(ConnectivityManager.TYPE_WIFI);  
当首选网络连接不可用或者连接丢失时,Android将自动尝试使用第二优先连接类型。


1.2 监控网络连接

ConnectivityManager最常用的一个功能就是当网络连接状态改变时通知应用程序,这是通过应用程序实现自己的Broadcast Receiver来监听ConnectivityManager.CONNECTIVITY_ACTION类型的intent来实现的。这个intent提供了以下几种extra来进一步明确发生改变的网络状态:


1)ConnectivityManager.EXTRA_IS_FAILOVER:值为true说明当前的连接是首选网络失效重连后的连接;


2)ConnectivityManager.EXTRA_NO_CONNECTIVITY:值为true表示当前设备没有连接到网络;


3)ConnectivityManager.EXTRA_REASON:如果当前的广播代表网络失效,则这个值包含了连接失效的原因描述;


4)ConnectivityManager.EXTRA_NETWORK_INFO:返回NetworkInfo对象,包含了当前连接事件相关的网络详细信息;


5)ConnectivityManager.EXTRA_OTHER_NETWORK_INFO:在一个网络断开连接时,这个值返回NetworkInfo对象,包含了可能的网络失效重连的详细信息;

6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可选的网络连接的额外信息。

二、WifiManager

         WifiManager代表Android中的Wi-Fi连接服务,它被用于配置Wi-Fi网络连接,管理当前Wi-Fi连接,扫描Wi-Fi接入点和监控Wi-Fi连接的状态改变。获取WifiManager的方法和Connectivity Manager类似,通过函数getSystemService,并提供参数Context.WIFI_SERVICE,代码片段如下:


[java]
String wserviceName = Context.WIFI_SERVICE;  
WifiManager wm = (WifiManager) getSystemService(wserviceName);  
同样的,需要在AndroidManifest.xml文件中指定访问许可:


[html]
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  
我们可以使用setWifiEnabled函数来设置使能和去使能Wi-Fi硬件,使用getWifiState和isWifiEnabled函数来查看当前Wi-Fi状态,代码片段如下:


[java]
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之间改变。它包含了两个额外的键值EXTRA_WIFI_STATE和EXTRA_PREVIOUS_STATE,分别表示新的和前一个Wi-Fi状态。


2)WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:Wi-Fi硬件和当前接入点之间的连接状态改变时,这个intent将被广播。额外的键值EXTRA_NEW_STATE用来表示是新的连接建立事件还是已存在的连接中断事件,为true表示新的连接建立。


3)WifiManager.NETWORK_STATE_CHANGED_ACTION:Wi-Fi连接状态改变时广播这个intent,包含两个额外的键值:一是EXTRA_NETWORK_INFO,它包含表示当前网络状态的NetworkInfo对象;一是EXTRA_BSSID,包含连接到的接入点的BSSID值。


4)WifiManager.RSSI_CHANGED_ACTION:监听这个intent可以使应用程序监控当前Wi-Fi连接的信号强度。包含一个额外键值EXTRA_NEW_RSSI,包含了当前信号强度。使用这个信号强度,需要使用静态函数calculateSignalLevel将这个值按指定的缩放转换为整型值。

2.2 创建和管理Wi-Fi连接和配置

         使用WiFi Manager可以进行网络配置,控制连接到哪个网络。当连接建立后,可以进一步获取活动网络连接的额外配置信息。使用函数getConfiguredNetworks可获得当前网络配置信息的列表,返回值是WifiConfiguration对象,包含了网络ID、SSID和其他配置信息。


要使用某一网络连接,可使用enableNetwork函数,传入网络ID并设置disableAllOthers参数为true即可,代码片段如下:


[java]
// Get a list of available configurations   
List<WifiConfiguration> configurations = wm.getConfiguredNetworks();  
// Get the network ID for the first one   
if (configurations.size() > 0) {  
    int netID = configurations.get(0).networkId;  
    // Enable the network   
    boolean disableAllOthers = true;  
    wm.enableNetwork(netID, disableAllOthers);  
}  
一旦连接建立,就可以使用getConnectionInfo函数来返回连接的状态,返回的是WifiInfo对象,包含了当前接入点的BSSID、Mac地址、IP地址,以及当前链路速度和信号强度。


下面的代码片段用于查询当前活动Wi-Fi连接并显示获取的相关信息:
[java]
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("Connected to {0} at {1}{2}. Strength {3}/5", 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热点扫描的过程:
[java]
  // Register a broadcast receiver that listens for scan results   
  registerReceiver(new BroadcastReceiver() {  
  
@Override  
public 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("{0} networks found. {1} is the strongest.",   
            results.size(), bestSignal.SSID);  
    Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG);  
}  
      
  }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));  
    
  //Initiate a scan   
  wifi.startScan();  


        要连接到网络,需要创建和注册WiFi配置,通常用户可以使用Android系统原生的WiFi配置程序,但我们也可以在自己的应用程序中提供相同的功能,设置完全替代原生的WiFi配置程序,这就要用到保存网络配置信息的WifiConfiguration类了。每个WiFi配置一般都会包含以下几个公共的数据项:
1)BSSID:指明接入点的BSSID;
2)SSID:某一特定网络的SSID;
3)networkId:用来唯一标识当前设备使用的网络配置的id;
4)priority:选择连接哪个接入点时要使用的每个网络配置的优先权;
5)status:当前网络连接的状态,取值如下:
WifiConfiguration.Status.ENABLED,WifiConfiguration.Status.DISABLED,WifiConfiguration.Status.CURRENT。


WifiConfiguration对象中还包括支持的认证技术以及用于与接入点进行认证的密钥。
使用addNetwork函数可以将新的WiFi配置添加到当前WiFi列表中,类似的,updateNetwork函数可以用于更新某个已存在的WiFi配置的某些信息;removeNetwork函数用于移除配置信息。要保存网络配置的任何变化,需要调用saveConfiguration函数。


原文连接:http://www.linuxidc.com/Linux/2012-02/53916p3.htm



Android Connectivity学习笔记–Bluetooth Android Connectivity学习笔记–Bluetooth 1. 应用场景 设备近距离传递数据的一种方式,无需通过网络连接,节省流量 数据交换方便,理论上可传输任意类型数据 2. 使用流程 (1) 权限声明 首先必须打开的是android.permission.BLUETOOTH权限,如果同时要将此应用做服务端使用(即监听客户端的连接),则同时应打开android.permission.BLUETOOTH_ADMIN权限(一般应用都需要实现这个功能),如下: <uses-permissi 阅读详情

相关推荐

Android Connectivity分析(1)- ConnectivityManager

ConnectivityManager 1.描述 负责监听网络连接的状态,并发送状态变化的广播。想应用提供一些控制接口 作为ConnectivityService的一层包装,实际功能实现在ConnectivityService中。 2.类结构分析   常量定义 intent相关network type定义 静态工具方法 public static String

人在码途 1万+

访问Android硬件资源の管理网络和Wifi连接

(1)ConnectivityManager 在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取ConnectivityManager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下: String cservi...

mmdev 302

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

Android ConnectivityService框架

Android中提供的数据业务方式有几种:移动数据网络,WIFI,热点,网线等。这些数据业务本身可以独立使用,但是同一时刻,只能使用其中的一种数据业务方式。管理这些数据业务方式的使用由ConnectivityService,NetworkFactory,NetworkAgent,NetworkMonitor等来完成,ConnectivityService处于核心调度位置。 Connectivi...

Jimmy的专栏 6909

VisDrone2019数据集实战:从下载到YOLO格式转换的完整指南

本文提供了一份完整的VisDrone2019数据集实战指南,详细介绍了从数据集下载、理解其独特的标注格式,到转换为YOLO模型可直接训练格式的全过程。通过清晰的代码示例和步骤讲解,帮助读者掌握处理复杂无人机视觉数据集的核心技能,为基于YOLO的目标检测模型训练做好准备。

weixin_29165725的博客 385

知识图谱本体建模工具Protege使用教程

1.下载 先去官网下载:protégé 直接下最新版,点击会有注册页面,只填必填项的name和project description即可。 下载后解压即可使用。 2、安装可视化工具Graphviz 去官网:Download | Graphviz下载。下一个最新版的zip就行。 我解压在了Protege文件夹下,然后在 Preference下指定目录。 指定一下你解压完的Graphviz下的dot.exe,确定。 PS:如果这样报错就尝试在环境变量的系统变量的...

子麒的博客 2万+

android学习日记02--android中判断网络连接状态之ConnectivityManager

ConnectivityManager主要管理和网络连接相关的操作 相关的TelephonyManager则管理和手机、运营商等的相关信息;WifiManager则管理和wifi相关的信息。 想访问网络状态,首先得添加权限 NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过其getState()方法获取的State对象则代表着 连接成功与否等状态。 ...

qq_38357122的博客 506

从理论到实践:TRL去嵌入校准在国产矢量网络分析仪上的应用全解析

本文全面解析了TRL去嵌入校准技术在国产矢量网络分析仪上的应用实践,从核心算法到工程实现。详细介绍了TRL校准的数学原理、国产VNA的程控接口开发、校准件质量评估及测量不确定度控制策略,帮助工程师掌握高频器件测量的关键技术。

tech5的博客 1014

Android中关于网络的一些知识点

前言 转载请说明出处,本文来自Android菜鸟:https://blog.youkuaiyun.com/android_cai_niao/article/details/106027313 QQ:2717521606 做Android开发的,免不了要使用到网络,这就经常需要用到一些网络相关的知识点,以前也没注意统计保存,时间久了有些知识就会忘,最近项目需要用到这些知识点,又花了一些时间学习,所以是时候记录一下以保存自己的学习成果了,免得每次用到都学习一次。 1、关于获取本机ip地址 需要权限: <uses

Android菜鸟的专栏 2824

Globus 数据下载

Globus 大数据下载流程~

weixin_43978558的博客 6634

八大核心深度学习算法详解:从CNN到Transformer的完整指南

深度学习作为人工智能的核心技术,通过多层神经网络模拟人脑学习机制。其基本原理是利用反向传播算法优化网络参数,从数据中自动提取特征表示。这一技术价值在于能够处理高维复杂数据,在图像识别、自然语言处理等领域实现突破性进展。卷积神经网络(CNN)通过局部连接和权值共享有效处理图像数据,而Transformer架构基于自注意力机制革新了序列建模方式。在实际工程实践中,CNN广泛应用于计算机视觉任务,如图像分类和目标检测;Transformer则成为自然语言处理的主流架构,支撑着BERT、GPT等预训练模型。本文系统

aoe41606的博客 432

Android 网络管理

系统中对网络的判断和选在是在Connectivityervice这个服务中来处理的,在系统启动的时候会启动这个系统服务: 系统启动完毕后,ConnectivityService在系统启动的时候就启动了。 在android内部,用framework/base/core/res/res/values/config.xml中定义了网络的类型: "default,wif...

abc20899的专栏 338

UNet改进(23):如何用SLCAM模块提升UNet的分割性能

本文提出一种改进的UNet架构,通过引入轻量化注意力模块(SLCAM)增强医学图像分割性能。SLCAM整合了通道和空间双重注意力机制:通道注意力采用全局池化和共享MLP学习通道权重,空间注意力通过7×7卷积捕捉上下文信息。网络在传统UNet基础上,在每个下采样和上采样块后加入SLCAM模块,并保持跳跃连接结构。实验表明,该方法能自适应聚焦重要特征,在不显著增加计算负担的情况下提升分割精度,特别适用于医学图像等需精确边界的场景。未来可探索三维注意力、动态参数调整等改进方向。

2501_91516851的博客 439

android中 检查 网络连接状态的变化,无网络时跳转到设置界面

1: 在AndroidManifest.xml中加一个声明                       NetCheckReceive.java文件如下 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent

strliu的专栏 2125

TMS320F28377D双核开发例程 - DSP开发

首先,我们需要创建一个新的工程来进行开发。然后,选择适当的目标设备为TMS320F28377D,并设置工程的名称和存储位置。在上面的代码中,我们定义了一个128个元素的输入数组和输出数组。然后,我们使用一个简单的数字信号处理算法,将输入数组中的每个元素平方,并将结果存储到输出数组中。这个芯片的双核架构提供了更高的计算能力和灵活性,使得数字信号处理的开发更加高效和可靠。希望本文对您有所帮助!当应用程序在TMS320F28377D芯片上运行时,它将对输入数组中的每个元素进行平方运算,并将结果打印出来。

IfllUnity的博客 2517

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

WifiConfigManager NetworkSelector 和 WifiConnectivityManager

WifiConnectivityManager 管理连接 在其收到底层传递的扫描结果消息时,在 handleScanResults 中处理,里面调用了如下主要步骤: 用到了 NetworkSelector 类对象进行处理,getCandidatesFromScan,以 ScanDetail 对象列表为输入获取到 WifiCandidates.Candidate 对象列表; 用到了 NetworkSelector 类对象进行处理,SelectNetwork,以前面的 WifiCandidates.Can

Hugo的博客 2321

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android六个Mnanager(ActivityManager、ConnectivityManager、、Telep、PowerManager、WindowManager、WifiManager)

Android六个Mnanager分别是ActivityManager、ConnectivityManager、TelephonyManager、PowerManager、WindowManager、WifiManager 一、ActivityManager        ActivityManager是与系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行中的进程信息,

zhangyiminsunshine的博客 882

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android网络管理

涉及到的主要类有:WifiManager

Habby的专栏 1032

android WIFI连接功能的封装,Android中wifi与数据流量的切换监听详解

最近在做一个wifi和移动数据的监控功能,来来回回折腾了一阵子,这个模块的主要功能是监听整个APP的wifi与数据流量的切换,让用户使用专用流量,而不是用wifi,给一个弹窗,点击确认,自动切换数据流量,关闭wifi。我的思路是写一个静态广播,监听在广播里面进行监听,启用系统弹窗,点击确认,自动切换网络,这里面有一个坑就是弹窗会在广播中多次被调用,其实只调用了一次,但是实际上多次调用系统的弹窗会一...

weixin_32481609的博客 657
上一篇: Tizen简介
下一篇: 如何使用 HTML5 的 Notification API
wolfman79
博客等级 码龄24年 25粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值