Wifi列表扫描和Wifi链接

news2024/9/20 16:44:01

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

 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.
     */
    @Deprecated
    public 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 {
        @Override
        public 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);

    }

    @Override
    protected 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}.
     */
    @Deprecated
    public 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() {
            @Override
            public void onAvailable(@NonNull Network network) {
                super.onAvailable(network);
                Log.e("nyz", "onAvailable");
                if (network != null) {
                }

            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                Log.e("nyz", "onUnavailable");
            }

            @Override
            public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
                super.onCapabilitiesChanged(network, networkCapabilities);
                Log.e("nyz", "网络变化");
            }
        });

    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振弦传感器和振弦采集仪应用隧道安全监测的解决方案

振弦传感器和振弦采集仪应用隧道安全监测的解决方案 现代隧道越来越复杂&#xff0c;对于隧道安全的监测也变得越来越重要。振弦传感器和振弦采集仪已经成为了一种广泛应用的技术&#xff0c;用于隧道结构的监测和评估。它们可以提供更精确的测量结果&#xff0c;并且可以在实…

三维模型3DTile格式轻量化压缩集群处理方法分析

三维模型3DTile格式轻量化压缩集群处理方法分析 在地理信息系统中&#xff0c;由于三维模型的数据密度和文件体积较大&#xff0c;因此需要进行轻量化和压缩处理。这里我们将对使用集群处理方法来实现3D Tiles数据的轻量化压缩进行探讨。 首先&#xff0c;集群计算是一种并行处…

WebDAV之π-Disk派盘 + 开源阅读

开源阅读是一款真正免费的小说阅读软件。开源阅读app有多种新颖的书籍资源。用户可以自由设置并添加书籍清单。无论是在线搜索和浏览还是本地TXT文件导入,都非常方便。当用户使用开源阅读应用阅读小说时,不会有广告跳出来,您可以阅读整个过程,开源阅读app是喜欢看小说的朋友…

持续集成交付CICD:Jenkins部署

目录 一、理论 1.CI/CD 2.Gitlab内置持续集成 3.Jenkins安装与部署 4.Gitlab服务部署 5.Jenkins服务部署 6.Tomcat服务部署 7.Jenkins–Pipeline流水线项目构建 二、实验 1.Gitlab服务部署 2.Jenkins服务部署 3.Tomcat服务部署 4.Jenkins–Pipeline流水线项目构建…

RabbitMQ常见的交换机类型

RabbitMQ安装 pom.xml里导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> application.properties配置文件 spring.rabbitmq.hos…

利用SoapUI工具生成Java WebService客户端代码

一. 下载安装软件 安装SoapUI 5.4.0-EB&#xff1b;下载axis-1_4&#xff0c;下载后解压至个人目录下即可。 注&#xff1a;axis-1_4下载地址&#xff08;https://archive.apache.org/dist/ws/axis/1_4/axis-bin-1_4.zip&#xff09; 二. 创建SOAP Project 点击File–>New…

GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

1 前言 &#x1f525;学长分享优质竞赛项目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这…

YOLOv7改进:原创独家首发 | 可变形自注意力Attention | 即插即用系列

💡💡💡本文属于原创独家改进:当你停留在可形变卷积上(DCNV1,DCNV2,DCNV3等),可形变Attention助力检测,创新性十足,不仅增强了 sparse attention 的表征能⼒,同时具有线性空间复杂度。 可形变与attention 的完美融合 | 亲测在多个数据集实现暴力涨点,对遮挡…

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

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

为什么说CDN是网站速度优化大师

CDN&#xff08;内容分发网络&#xff09;是一个强大的工具&#xff0c;可以帮助您的网站实现飞一般的加载速度。本文将引领您深入了解CDN的奇妙世界&#xff0c;揭示其强大功能&#xff0c;并提供关于如何充分利用CDN服务来提升网站性能的宝贵建议。 探索CDN的世界 CDN&#x…

功率半导体器件静态参数测试都测哪些内容?

功率半导体器件如今已成为不可或缺的元件&#xff0c;在通信、电力电子等领域得到广泛应用。而对其性能参数的测试也是必不可少的&#xff0c;是对半导体性能、质量的保障。半导体测试参数包含静态测试参数和动态测试参数&#xff0c;本文将介绍半导体分立器件静态测试参数的相…

随手拍文明城市美丽乡村监督上报小程序开发

功能介绍&#xff1a; 一款拍照上传系统&#xff0c;ThinkPHP Uniapp开发&#xff0c;代码简洁&#xff0c;UI清爽。 后台功能 1、应用配置&#xff1a;首页轮播图配置&#xff1b;上报事件标签&#xff1b;上报等级&#xff08;可设置积分&#xff09;&#xff1b;小程序配…

gitlab docker部署,备份,恢复。附踩坑记录

本次安装在CentOS7下进行 1、安装yum 检查是否已经安装yum yum --version如果未安装 sudo yum install -y yum-utils添加镜像源&#xff1a; 国外镜像源&#xff1a;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里镜像源&am…

【vue富文本插件】tinymce 安装使用及汉化注意项

文章目录 前言一、tinymce 下载安装1.1 npm 安装1.2 提供 CDN 版本免费下载 二、tinymce 本地化三、编写富文本组件四、在其他 .vue 组件中引入上面编写的 myEditor 组件 五、相关问题5.1 汉化5.2 富文本不显示或者黄色文本提示 附&#xff1a;引入第三方拓展啊插件 前言 前端…

HNU-计算机网络-讨论课1

题目&#xff1a; 有关网络系统结构的讨论 一、必选问题&#xff08;每组平均每人1个&#xff09; 1、分层结构其实是世界演进形成的普遍系统结构&#xff0c;不管是自然领域还是社会领域&#xff0c;请举例说说你的理解。 2、有人说通信网络的核心技术在物理层&#xff0c…

Soul CEO张璐团队以用户安全为核心,探索社交平台安全治理新路径

“认同感”,是现代年轻人当下的核心社交需求之一,作为年轻人喜爱的新型开放式社交平台,Soul APP为年轻人们提供了一个自在表达、轻松互动的平台,为用户带来了志趣相投、精神共鸣的高质量网络连接。在Soul日活近千万的用户中,超过七成为Z世代年轻群体,如何能够为Z世代提供更安全…

MySQL增删查改(进阶2)

一、查询 1.聚合查询 1.1聚合函数&#xff1a; &#xff08;1&#xff09;count() 获取整个结果集的行数&#xff08;数据的数量&#xff09; count&#xff08;某个字段&#xff09;count(*)count&#xff08;常量值&#xff09; &#xff08;2&#xff09;sum(某个字段)…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例评测用例(五)

六、华为云耀云服务器L实例评测用例&#xff1a; “兵马未动&#xff0c;粮草先行”&#xff0c;随着企业业务的快速发展&#xff0c;服务器在数字化建设体系至关重要&#xff0c;为了保证服务器的稳定性、可靠性&#xff0c;需要对服务器进行评测&#xff0c;以确保服务器能够…

用“和美”丈量中国丨走进酒博物馆系列⑨

五粮液酒文化博览馆始建于1988年&#xff0c;是中国酒业最早的酒文化博览馆&#xff0c;于2020年启动升级改造。 现在我们看到的五粮液酒文化博览馆&#xff0c;采用了当今博览馆最前沿的展陈方式&#xff0c;展陈设计与空间布局更具灵动性和多元性&#xff0c;蕴含传统文化氛围…

Python的就业前景及薪资收入

作为近几年来特别受欢迎的编程语言之一&#xff0c;Python一直以来被众多行业内人士寄予厚望&#xff0c;今后有可能替代老牌霸主Java&#xff0c;成为新一代编程语言榜首。 与其他语言相比&#xff0c;Python中的语言语法特别简单&#xff0c;并且代码具有可读性&#xff0c;多…