zoukankan      html  css  js  c++  java
  • Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网。因此,掌握基本的WiFI开发技术是非常必要的。本教程将围绕一个小Demo初步与大家一同探讨WiFi开发。

    先上效果图

    这里写图片描述
    这里写图片描述
    这里写图片描述

    Demo功能比较简单,四个按钮、两个文本和一个列表。功能主要有创建WiFi热点,关闭WiFi热点,搜索WiFi,连接WiFi,数据通讯。源码会在教程结尾提供。

    本章节主要介绍WiFi热点的创建和关闭

    需要用到的权限

     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>

    WiFi热点的创建

    /**
         * 创建Wifi热点
         */
        private void createWifiHotspot() {
            if (wifiManager.isWifiEnabled()) {
                //如果wifi处于打开状态,则关闭wifi,
                wifiManager.setWifiEnabled(false);
            }
            WifiConfiguration config = new WifiConfiguration();
            config.SSID = WIFI_HOTSPOT_SSID;
            config.preSharedKey = "123456789";
            config.hiddenSSID = true;
            config.allowedAuthAlgorithms
                    .set(WifiConfiguration.AuthAlgorithm.OPEN);//开放系统认证
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
            //通过反射调用设置热点
            try {
                Method method = wifiManager.getClass().getMethod(
                        "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
                boolean enable = (Boolean) method.invoke(wifiManager, config, true);
                if (enable) {
                    textview.setText("热点已开启 SSID:" + WIFI_HOTSPOT_SSID + " password:123456789");
                } else {
                    textview.setText("创建热点失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                textview.setText("创建热点失败");
            }
        }

    这里我们需要用到一个很重要的API——WifiManager。源码中是有这么一段介绍:

    This class provides the primary API for managing all aspects of Wi-Fi
    connectivity. Get an instance of this class by calling
    {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}.

    可以了解到,我们能够通过WifiManager来管理WiFi的连接。而通过Context.getSystemService(Context.WIFI_SERVICE)就能获取到它的实例。

    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    在开启热点的时候,我们需要确保WiFi是关闭状态,因为大部分手机都是不支持热点和WiFi是同时开启的。接着就需要创建WifiConfiguration这个类,由于配置我们所要创建的热点的属性。这里我们所需注意的主要是SSID、preSharedKey和KeyMgmt。 分别对应热点的名称、密码和加密方式。

    配置完属性后,我们就可以通过Java的反射机制去创建热点。

    WiFi热点的关闭

    /**
         * 关闭WiFi热点
         */
        public void closeWifiHotspot() {
            try {
                Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
                method.setAccessible(true);
                WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);
                Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                method2.invoke(wifiManager, config, false);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }

    跟创建WiFI热点一样,关闭的时候同样需要用到Java的反射机制。在调用Method的invoke方法时,将最后一个参数改成false就可以了。

    相对来说,WiFi热点的创建与关闭还是比较简单的。欢迎继续阅读下一篇Android WiFi开发教程(二)——WiFi的搜索和连接

  • 相关阅读:
    美团容器平台架构及容器技术实践
    【人物志】美团首席科学家夏华夏:不断突破边界的程序人生
    Category 特性在 iOS 组件化中的应用与管控
    浅谈大型互联网企业入侵检测及防护策略
    【基本功】深入剖析Swift性能优化
    CAT 3.0 开源发布,支持多语言客户端及多项性能提升
    安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目
    .Net Core Redis的使用
    焦点IT Redis安装与配置( Windows10 或Windows server)
    用VScode配置Python开发环境
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/7552214.html
Copyright © 2011-2022 走看看