首页 > 其他分享 >[Android] wifi管理之WifiManager

[Android] wifi管理之WifiManager

时间:2023-08-09 11:06:06浏览次数:38  
标签:WiFi wifi 扫描 获取 WifiManager Android BroadcastReceiver

1. WifiManager简介

WifiManager是Android系统中负责管理WiFi网络的一个重要服务。它提供了一系列方法,允许开发者搜索、连接、保存、删除WiFi网络,还可以获取当前WiFi的连接状态、信号强度等信息。

主要功能:

  • 连接到一个特定的WiFi网络:你可以使用WifiManager的addNetwork(WifiConfiguration config)方法,通过创建并配置WifiConfiguration对象,来指定要连接的WiFi网络。连接成功后,该网络的设置将被保存在设备中,除非明确地使用removeNetwork(int netId)方法删除。
  • 搜索附近的WiFi网络:WifiManager的startScan()方法可以启动WiFi扫描,获取附近所有可用的WiFi网络。扫描结果可以通过调用getScanResults()方法获取。
  • 获取和更改WiFi的状态:WifiManager提供了getWifiState()setWifiEnabled(boolean enabled)方法,用来获取和设置WiFi的状态。如果你想检查WiFi是否已经打开,或者你想打开或关闭WiFi,这些方法都非常有用。
  • 获取当前连接的WiFi网络的信息getConnectionInfo()方法可以获取当前连接的WiFi网络的信息,包括SSID、BSSID、速度、信号强度等。
  • 监听WiFi状态的改变:你可以使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法注册一个广播接收器,来监听WiFi的状态改变,包括WiFi的打开、关闭、连接状态的改变等。

注意,在使用WifiManager时,你需要在AndroidManifest.xml文件中声明相关的权限,例如ACCESS_WIFI_STATECHANGE_WIFI_STATEACCESS_NETWORK_STATE,和CHANGE_NETWORK_STATE等。如果你想进行WiFi扫描,你还需要声明ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限。

虽然WifiManager为开发者提供了许多有用的功能,但你需要注意,长时间运行WiFi扫描或者频繁地打开和关闭WiFi可能会消耗大量的电量,因此在使用时要尽可能地考虑到电量优化。

2. WifiManager使用例子

在Android中,你可以使用WifiManager来发起WiFi扫描,并注册一个BroadcastReceiver来接收扫描完成的广播。当扫描完成时,你可以通过WifiManager的getScanResults()方法获取扫描结果。

以下是一个完整的例子:

首先,你需要在你的AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后,在你的Activity或Service中:

public class MainActivity extends AppCompatActivity {

    private WifiManager wifiManager;
    private BroadcastReceiver wifiScanReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取WifiManager实例
        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

        // 创建一个BroadcastReceiver,用来接收扫描完成的广播
        wifiScanReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                boolean success = intent.getBooleanExtra(
                        WifiManager.EXTRA_RESULTS_UPDATED, false);

                if (success) {
                    // 获取扫描结果
                    List<ScanResult> scanResults = wifiManager.getScanResults();

                    // 扫描结果是一个List,其中每一个元素代表一个扫描到的WiFi网络
                    for (ScanResult scanResult : scanResults) {
                        // 每一个ScanResult对象包含了很多信息,例如SSID、BSSID、capabilities、level等
                        String SSID = scanResult.SSID;
                        String BSSID = scanResult.BSSID;
                        String capabilities = scanResult.capabilities;
                        int level = scanResult.level;

                        // 你可以在这里处理每一个扫描结果
                        Log.d("WIFISCAN", "SSID: " + SSID + ", BSSID: " + BSSID);
                    }
                } else {
                    // 扫描失败,可能需要处理错误情况
                }
            }
        };

        // 创建一个IntentFilter,用来监听扫描完成的广播
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

        // 注册BroadcastReceiver
        registerReceiver(wifiScanReceiver, intentFilter);

        // 发起WiFi扫描
        wifiManager.startScan();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 不再需要的时候,记得要解注册BroadcastReceiver
        unregisterReceiver(wifiScanReceiver);
    }
}

以上的例子会在Activity创建时发起一次WiFi扫描,并在扫描结果可用时打印出每个扫描结果的SSID和BSSID。

注意,为了能获取到扫描结果,你还需要在设备的设置中打开WiFi和位置权限。另外,因为WiFi扫描可能会消耗大量的电量,所以你应该尽可能地优化你的代码,避免不必要的扫描。

3. 相关问题

3.1 如何获取最新的wifi扫描结果?

在Android中,当接收到WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播时,该Intent可能包含以下两个额外的参数:

  1. EXTRA_RESULTS_UPDATED(自Android 28版本起):这是一个布尔值,指示扫描是否成功完成并且结果可用。如果值为true,表示扫描结果可用且已更新。如果值为false,表示扫描未能成功完成,结果可能不可用或已过时。
  2. EXTRA_SCAN_AVAILABLE(自Android 31版本起):这是一个布尔值,指示是否还可以继续扫描。如果值为true,表示可以继续进行新的扫描。如果值为false,表示已达到扫描限制,无法继续进行新的扫描。

以下是如何在广播接收器中使用这些额外参数的示例:

BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
            // 检查扫描是否成功完成
            boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
            if (success) {
                // 获取扫描结果
                List<ScanResult> scanResults = wifiManager.getScanResults();
                // 处理扫描结果...
            } else {
                // 扫描未能成功完成,结果可能不可用或已过时
            }

            // 检查是否还可以继续扫描
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                boolean canScan = intent.getBooleanExtra(WifiManager.EXTRA_SCAN_AVAILABLE, true);
                if (canScan) {
                    // 可以继续进行新的扫描
                } else {
                    // 已达到扫描限制,无法继续进行新的扫描
                }
            }
        }
    }
};

请注意,EXTRA_SCAN_AVAILABLE只在Android 31及更高版本中可用,因此在使用之前,你需要检查当前设备的Android版本。


标签:WiFi,wifi,扫描,获取,WifiManager,Android,BroadcastReceiver
From: https://blog.51cto.com/u_16175630/7016766

相关文章

  • Android TTS学习——继续爱的表白(转)
    一. 简单介绍在上一篇里 我们讲到了TTS 最主要的一个APIpublicintspeak(String   text,intqueueMode,   HashMap<String,   String>params)其中我们介绍了前两个参数,第三个参数设置了null而且我们在介绍AndroidTTS 提供的功能时,说到TTS 提供了两个接口,第......
  • Android TTS学习——用五种外语说出“我爱你”(转)
    一. 简单介绍在上一篇里我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 ......
  • Android TTS学习——保存对你的喜欢(转)
    一. 简单介绍在上一篇里我们介绍了TTS提供的接口 OnUtteranceCompletedListener 的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文......
  • Android13冻结进程分析:如何提高设备性能和用户体验
    Android13冻结进程分析:如何提高设备性能和用户体验本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了......
  • Android平台GB28181设备接入端如何实现多视频通道接入?
    技术背景我们在设计Android平台GB28181设备接入模块的时候,有这样的场景诉求,一个设备可能需要多个通道,常见的场景,比如车载终端,一台设备,可能需要接入多个摄像头,那么这台车载终端设备可以作为主设备,然后,主设备下,配置多个通道,听起来是不是有点儿类似于DVR或NVR?技术实现这里,我们说下,我们......
  • AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
    前言最近在写一个关于某音的脚本,包含刷视频/点赞/收藏/分享/评论等一些列功能,借助于AutoX来实现,虽然我老早就买了AutoJsPro但是最新版本阉割的有点厉害。。。内容思索很简单就是,找到布局后,获取坐标信息,使用click去触发;varbtn=className("android.widget.TextView").t......
  • Android build.gradle 基本规则
    Androidbuild.gradle基本规则一个完整示例://此乃本脚本执行所需依赖,以下分别对应maven库和插件buildscript{repositories{//从AndroidStudio3.0后新增了google()配置,可以引用google上的开源项目google()mavenCentral()//......
  • Android之Spinner用法,key/value模式
    参考:http://www.dedeyun.com/it/m/98498.htmlhttps://blog.csdn.net/myxiaoq/article/details/258696931.key、value类,需要重写toString()方法,返回text就是Spinner要显示的keypackagecom.jay.common;publicclassSpinnerData{privateStringvalue="";private......
  • Android开发 Jetpack compose LazyColumn 与 LazyRow、LazyVerticalGrid、LazyHorizon
    前言  此篇博客讲解LazyColumn与LazyRow、LazyVerticalGrid、LazyHorizontalGrid,在compose里LazyColumn与LazyRow与是用来延迟加载数据的,它对标原来xml里的ListView与RecyclerView。LazyColumn纵向列表效果图代码@ComposablefunAPage(){vallistData=remembe......
  • android 对话框AlertDialog。
    API:java.lang.Object ↳ android.app.AlertDialog.Builder使用AlertDialog.Builder创建对话框需要了解以下几个方法:setTitle:为对话框设置标题setIcon:为对话框设置图标setMessage:为对话框设置内容setView:给对话框设置自定义样式setItems:设置对话框要显示的一个list,一般用......