Wifi列表扫描和Wifi链接

 上面的截图,就是本文要介绍的主要功能。

 1.准备工作,声明权限:

 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><uses-permission android:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" />

2.打开WIfi:

    1)申请权限:注意的一点就是,打开wifi需要申请位置权限

    String[] permsLocation = {"android.permission.ACCESS_WIFI_STATE", "android.permission.CHANGE_WIFI_STATE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"};
    //获取权限private void getPerMission() {mPermissionsChecker = new PermissionsChecker(MainActivity.this);if (mPermissionsChecker.lacksPermissions(permsLocation)) {ActivityCompat.requestPermissions(MainActivity.this, permsLocation, 1000);}}

  2)打开wifi

     获取WifiManager:

 wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
  public boolean openWifi(WifiManager mWifiManager) {boolean bRet = true;Log.e("nyz", "wifi enable " + mWifiManager.isWifiEnabled());//android Q 不能使用,只能跳转设置界面,手动开启。startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))if (!mWifiManager.isWifiEnabled()) {bRet = mWifiManager.setWifiEnabled(true);}Log.e("nyz", "wifi result " + bRet);return bRet;}

  需要注意的一点就是,Android10以上下面的打开Wifi的功能将会失效,需要跳转到设置界面,由用户手动打开。

 * @deprecated Starting with Build.VERSION_CODES#Q, applications are not allowed to* enable/disable Wi-Fi.* <b>Compatibility Note:</b> For applications targeting* {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code false}* and will have no effect. If apps are targeting an older SDK (* {@link android.os.Build.VERSION_CODES#P} or below), they can continue to use this API.*/@Deprecatedpublic boolean setWifiEnabled(boolean enabled) {try {return mService.setWifiEnabled(mContext.getOpPackageName(), enabled);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}

3.获取WIfi列表:

    1)创建一个BroadCastReceiver:

       收到 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 广播后,可以获取WIfi列表

class WifiReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (TextUtils.isEmpty(intent.getAction())) {return;}String action = intent.getAction();Log.e("nyz", "action " + action);if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {boolean result = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);List<ScanResult> wifiList = wifiManager.getScanResults();Log.e("nyz", "results " + wifiList.size() + " result " + result);if (wifiList != null) {for (int i = 0; i < wifiList.size(); i++) {ScanResult wifi = wifiList.get(i);if (TextUtils.isEmpty(wifi.SSID)) {continue;}Log.e("nyz", "BSSID " + wifi.BSSID);Log.e("nyz", "SSID " + wifi.SSID);Log.e("nyz", "level " + wifi.level);Log.e("nyz", "capabilities " + wifi.capabilities);//拿到结果后,可以更新界面,在界面展示}}} else if (WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION.equals(action)) {} else if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {}}}

  2)注册和反注册:

 private void registerReceiver() {wifiReceiver = new WifiReceiver();IntentFilter filter = new IntentFilter();filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);filter.addAction(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);registerReceiver(wifiReceiver, filter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(wifiReceiver);}

  3)开始扫描Wifi:

      调用  wifiManager.startScan();开始扫描。搜索到附近的Wifi后,系统会发布广播,可以在广播接收者中,收到wifi列表信息。

 findViewById(R.id.scan).setOnClickListener(v -> {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this, permsLocation, 1000);return;}boolean result = wifiManager.startScan();Log.e("nyz", "result " + result);List<ScanResult> wifiList = wifiManager.getScanResults();Log.e("nyz", "size " + wifiList.size());
//            if (wifiList != null) {
//                for (int i = 0; i < wifiList.size(); i++) {
//                    ScanResult wifi = wifiList.get(i);
//                    Log.e("nyz", "BSSID " + wifi.BSSID);
//                    Log.e("nyz", "SSID " + wifi.SSID);
//                    Log.e("nyz", "level " + wifi.level);
//                    Log.e("nyz", "capabilities " + wifi.capabilities);
//                }
//            }WifiInfo wifiInfo = wifiManager.getConnectionInfo();Log.e("nyz", "wifiInfo = " + (wifiInfo == null));});

4.链接wifi:   

 private void connWifi(Context context, String ssid, String pwd) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}Log.e("nyz", "sdk " + Build.VERSION.SDK_INT);if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {WifiConfiguration config = createWifiInfo(ssid, pwd);int netId = wifiManager.addNetwork(config);Log.e("nyz", "netID " + netId);boolean isConn = wifiManager.enableNetwork(netId, true);Log.e("nyz", "isConn " + isConn);} else {
//            connectSuggestion(ssid, pwd);connectSpecifier(ssid, pwd);}}

          在Android10以前,可以通过addNetwork的方式进行链接,在Android10以后,这种方式就不推荐使用了。

   

  * @deprecated* a) See {@link WifiNetworkSpecifier.Builder#build()} for new* mechanism to trigger connection to a Wi-Fi network.* b) See {@link #addNetworkSuggestions(List)},* {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration* when auto-connecting to wifi.* <b>Compatibility Note:</b> For applications targeting* {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return {@code -1}.*/@Deprecatedpublic int addNetwork(WifiConfiguration config) {if (config == null) {return -1;}config.networkId = -1;return addOrUpdateNetwork(config);}

  Android10以后链接wifi:

    1)建议的方式:

     官方文档:适用于互联网连接的 WLAN 建议 API  |  Android 开发者  |  Android Developers

 @RequiresApi(api = Build.VERSION_CODES.Q)private void connectSuggestion(String ssid, String pwd) {WifiNetworkSuggestion suggestion2 =new WifiNetworkSuggestion.Builder().setSsid(ssid).setWpa2Passphrase(pwd)//是否可以接收到android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION.setIsAppInteractionRequired(true).build();List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion>();suggestionsList.add(suggestion2);int status = wifiManager.addNetworkSuggestions(suggestionsList);Log.e("nyz", "status " + status);if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {}}

   2)点对点的方式:

官方文档:WifiNetworkSpecifier  |  Android Developers

  @RequiresApi(api = Build.VERSION_CODES.Q)private void connectSpecifier(String ssid, String pwd) {WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder().setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX)).setWpa2Passphrase(pwd).build();NetworkRequest request = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).setNetworkSpecifier(specifier).build();ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {@Overridepublic void onAvailable(@NonNull Network network) {super.onAvailable(network);Log.e("nyz", "onAvailable");if (network != null) {}}@Overridepublic void onUnavailable() {super.onUnavailable();Log.e("nyz", "onUnavailable");}@Overridepublic void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {super.onCapabilitiesChanged(network, networkCapabilities);Log.e("nyz", "网络变化");}});}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/154792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.selenium进阶

文章目录 1、嵌套网页1、1 什么是嵌套页面1、2 selenium获取嵌套页面的数据 2、执行JavaScript代码3、鼠标动作链4、selenium键盘事件5、其他方法5、1 选择下拉框5、2 弹窗的处理 6、selenium设置无头模式7、selenium应对检测小结 1、嵌套网页 ​ 在前端开发中如果有这么一个需…

使用css 与 js 两种方式实现导航栏吸顶效果

position的属性我们一般认为有 position:absolute postion: relative position:static position:fixed position:inherit; position:initial; position:unset; 但是我最近发现了一个定位position:sticky 这个可以称为粘性定位。 这个粘性定位的元素会始终在那个位置 <st…

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…

虹科方案丨自动驾驶多传感器数据融合方法

文章来源&#xff1a;雅名特自动驾驶 点此阅读原文&#xff1a;https://mp.weixin.qq.com/s/QsPMWZDGZaPdEx47L2VmeA 近年来&#xff0c;深度学习技术在涉及高维非结构化数据领域展现出了最先进的性能&#xff0c;如计算机视觉、语音、自然语言处理等方面&#xff0c;并且开始涉…

Django实战项目-学习任务系统-用户登录

第一步&#xff1a;先创建一个Django应用程序框架代码 1&#xff0c;先创建一个Django项目 django-admin startproject mysite将创建一个目录&#xff0c;其布局如下&#xff1a;mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2&#xff0c;再创建一个…

智能视频分析系统AI智能分析网关V3触发告警图片不显示该如何解决?

AI智能分析网关V3包含有20多种算法&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合我们的视频监控系统EasyCVR一起使用&#xff0c;可…

Android免杀小结

目录 msfvenom 自动生成 自带免杀 工具免杀 Thefatrat backdoor-apk old-fatrat msfVenom嵌入式方法 venom 工具小记 加壳 源码免杀 加壳 源码混淆 数据通信 启动和运行方式修改 对抗反编译 反编译工具崩溃 ZIP文件格式对抗 ZIP通用位伪加密 AndroidManife…

MySQL 面试知识脑图 初高级知识点

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuid18b10870122586-src&share_type1 sql_mode 基本语法及校验规则 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作&#xff0c;如果在SELECT中的列&#xff0c;没有在GROUP BY中出现&#xff…

网络初识(JAVA EE)

文章目录 一、网络发展史二、网络通信基础三、协议分层四、封装和分用 一、网络发展史 独立模式&#xff1a;计算机之间相互独立&#xff0c;每个终端都各自持有客户数据&#xff0c;且当处理一个业务时&#xff0c;按照业务流程进行 网络互连&#xff1a;将多台计算机连接在一…

如何退出commit_message页面

虽然提示命令了&#xff0c;但我试了&#xff0c;退不出去。我没搞明白。。。 退出编辑 Crtl Z设置git的编辑器为vim或vi git config --global core.editor vim如果没有vim编辑器&#xff0c;设置成vi编辑器也行 git config --global core.editor vi重新提交 再次进入commi…

【HTML5】语义化标签记录

前言 防止一个页面中全部都是div&#xff0c;或者ul li&#xff0c;在html5推出了很多语义化标签 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 常用语义化案例 一般我用的多的是header&#xff0c;main&#xff0c;footer 这些标签不难理解&#x…

怎么通过Fiddler对APP进行抓包?以及高级应用场景分析

前言 我们经常需要用到Fiddler做代理服务器对Web、APP应用进行抓包&#xff0c;以便我们对接口功能进行测试调试&#xff0c;定位问题等。这篇将讲述怎么通过Fiddler对APP进行抓包&#xff0c;以及简单介绍一些高级应用场景。 首先&#xff0c;附上Fiddler使用的环境配置清单…

MidJourney | AI绘画也有艺术

免费绘画&#xff0c;体验更多AI可关&注公&众&号&#xff1a;AI研究工厂

华测监测预警系统 2.2 存在任意文件读取漏洞

华测监测预警系统 2.2 存在任意文件读取漏洞 一、 华测监测预警系统 2.2 简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现1、手动复现2、自动复现 六、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信…

暴涨100万粉仅用一个月,B站内容趋势前线洞察

- 导语 在这个9月&#xff0c;B站涌现多位黑马UP主&#xff0c;有的UP主自入驻B站以来&#xff0c;一个月的时间就涨粉百万晋升为头部UP主&#xff0c;有的UP主因内容受到B站百万年轻人的追捧&#xff0c;展现账号爆发力。 接下来&#xff0c;飞瓜数据&#xff08;B站版&…

LCD1602驱动开发

目录 一、LCD1602简介 二、LCD1602的电路原理图 三、1602的引脚定义 四、通信协议 操作步骤: 五、LCD1602关键性的指令设置 1.清屏指令 2.进入模式设置指令 3.显示开关控制指令 4.功能设定指令 六、写入数据操作 1、地址的计算 2、RAM地址映射图 七、LCD1602函数驱…

基于DeOldify的给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术&#xff0c;如 DeOldify&#xff0c;可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。 文章目录 准备工作执行代码图片上色视频上色 总结 准备工作 这里用 git clone 命令克隆…

Windows下Mosquitto服务配置监听任何IP,搭配使用MQTTX

Mosquitto 默认只监听本地地址&#xff0c;想让它监听其他的IP和端口需要以下操作在mosquitto.conf文件最后加如下内容 allow_anonymous true listener 1883 0.0.0.0 在启动的时候只需要 .\mosquitto.exe -c .\mosquitto.conf -v 就可以了

数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。简单地理解&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色&#xff0c;使用的是一个可插拔存储引擎架构&#xff0c;能够在运行的时候动态加载或者卸载这些存…

cuML机器学习GPU库

目录 一、开始安装 1、创建虚拟环境 2、激活该虚拟环境 3、安装cuML 4、安装ipykernel 5、在jupter上使用&#xff0c;所以需要配置一下新的内核 二、调试 1、原始机器学习库运行 2、cuml库运行 以下安装教程为基于Linux系统&#xff0c;cuda版本为11.3.109、驱动530.…