博客
关于我
Android 设置Wifi热点、打开与关闭的监听
阅读量:227 次
发布时间:2019-02-28

本文共 6969 字,大约阅读时间需要 23 分钟。

Android WiFi热点管理与状态监听技术说明

创建WiFi热点

在Android系统中创建WiFi热点的实现步骤如下:

  • 获取WiFi管理服务:首先通过反射机制获取WiFiManager实例,这将是我们进行热点配置和操作的主要工具。

  • 配置热点参数:创建一个WifiConfiguration对象,并填充必要的参数:

    • SSID:热点的名称,可以是任意字符串。
    • 密码:热点的安全访问密钥,支持PSK认证模式。
    • 网络协议:配置支持的网络协议以确保热点兼容性。
    • 加密算法:设置允许的加密算法,以确保连接的安全性。
  • 创建热点:通过反射调用WiFiManager的setWifiApEnabled方法,传递配置参数,开启热点功能。需要注意的是,Android系统要求WiFi和热点不能同时打开,因此在开启热点前需要先确保WiFi已关闭。

  • 热点状态管理:通过反射调用相应的方法来控制热点的开启和关闭状态。例如,isWifiApEnabled方法可以用于检查热点是否已开启。

  • 热点状态监听

    为了实现对WiFi热点状态的实时监听,可以使用广播接收器和观察者模式:

  • 注册广播接收器:在Android服务中注册一个广播接收器,监听android.net.wifi.WIFI_AP_STATE_CHANGED事件。该事件提供了热点的状态信息,状态值为:

    • 10:热点正在关闭
    • 11:热点已关闭
    • 12:热点正在开启
    • 13:热点已开启
  • 服务模式实现:将状态监听逻辑封装到一个服务中,通过注册动作接收器实现长期运行。服务可以根据收到状态变化事件,触发相应的业务逻辑。

  • 状态更新通知:通过观察者模式,将热点状态变化通知到所有注册的监听器,确保多个组件能够实时获取状态信息。

  • 代码示例

    // WiFi热点工具类public class WifiHotUtil {    private WifiManager mWifiManager;    private Context mContext;    public WifiHotUtil(Context context) {        mContext = context;        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);    }    // 启用热点    public void startWifiAp(String ssid, String passwd) {        if (mWifiManager.isWifiEnabled()) {            mWifiManager.setWifiEnabled(false);        }        if (!isWifiApEnabled()) {            stratWifiAp(ssid, passwd);        }    }    // 热点配置    private void stratWifiAp(String mSSID, String mPasswd) {        try {            Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);            WifiConfiguration netConfig = new WifiConfiguration();            netConfig.SSID = mSSID;            netConfig.preSharedKey = mPasswd;            netConfig.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);            netConfig.allowedProtocols.set(Protocol.RSN);            netConfig.allowedProtocols.set(Protocol.WPA);            netConfig.allowedKeyManagement.set(KeyMgmt.WPA_PSK);            netConfig.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);            netConfig.allowedPairwiseCiphers.set(PairwiseCipher.TKIP);            netConfig.allowedGroupCiphers.set(GroupCipher.CCMP);            netConfig.allowedGroupCiphers.set(GroupCipher.TKIP);            method.invoke(mWifiManager, netConfig, true);        } catch (Exception e) {            e.printStackTrace();        }    }    // 检查热点状态    public boolean isWifiApEnabled() {        try {            Method method = mWifiManager.getClass().getMethod("isWifiApEnabled");            method.setAccessible(true);            return (Boolean) method.invoke(mWifiManager);        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }        return false;    }    // 关闭热点    public void closeWifiAp() {        WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);        if (isWifiApEnabled()) {            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();            }        }    }}// 热点状态监听接口public interface WiFiAPListener {    public static final int WIFI_AP_CLOSEING = 10;  // 热点正在关闭    public static final int WIFI_AP_CLOSE_SUCCESS = 11;  // 热点关闭成功    public static final int WIFI_AP_OPENING = 12;  // 热点正在开启    public static final int WIFI_AP_OPEN_SUCCESS = 13;  // 热点开启成功    public void stateChanged(int state);}// 热点状态监听器public class WiFiAPObserver implements WiFiAPListener {    private HashSet
    listenerSet = new HashSet<>(); public void addWiFiAPListener(WifiAPListener listener) { if (!listenerSet.contains(listener)) { listenerSet.add(listener); } } public void removeWiFiAPListener(WifiAPListener listener) { if (listenerSet.contains(listener)) { listenerSet.remove(listener); } } public void clearWiFiAPListener() { listenerSet.clear(); } @Override public void stateChanged(int state) { for (WiFiAPListener listener : listenerSet) { listener.stateChanged(state); } }}// 热点状态监听服务public class WiFiAPService extends Service { private static final String TAG = "WiFiAPService"; private static final String ACTION_START_SERVICE = "action_start_service"; private static final String ACTION_STOP_SERVICE = "action_stop_service"; private static WiFiAPObserver wiFiAPObserver = new WiFiAPObserver(); public static void startService(Context context) { Intent intent = new Intent(context, WiFiAPService.class); intent.setAction(ACTION_START_SERVICE); context.startService(intent); } public static void stopService(Context context) { Intent intent = new Intent(context, WiFiAPService.class); intent.setAction(ACTION_STOP_SERVICE); context.startService(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); if (intent.getAction().equals(ACTION_START_SERVICE)) { // 开始监听热点状态 registerReceiver(wifiReceiver, new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED")); } else if (intent.getAction().equals(ACTION_STOP_SERVICE)) { stopSelf(); } return START_REDELIVER_INTENT; } @Override public void onCreate() { registerReceiver(wifiReceiver, new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED")); super.onCreate(); } @Override public void onDestroy() { unregisterReceiver(wifiReceiver); wiFiAPObserver.clearWiFiAPListener(); super.onDestroy(); } private BroadcastReceiver wifiReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if ("android.net.wifi.WIFI_AP_STATE_CHANGED".equals(action)) { int state = intent.getIntExtra("wifi_state", 0); Log.i(TAG, "state= " + state); wiFiAPObserver.stateChanged(state); } } };}

    使用说明

  • 工具类使用
  • WifiHotUtil wifiHotUtil = new WifiHotUtil(this);wifiHotUtil.startWifiAp("hotspot", "password");// 关闭热点wifiHotUtil.closeWifiAp();
    1. 服务监听:在WiFiAPService中注册状态监听器,并在需要的时候启动服务:
    2. WiFiAPService.startService(this);
      1. 状态通知:实现WiFiAPListener接口,注册到服务中,接收状态变化通知:
      2. WiFiAPService.addWiFiAPListener(this);

        通过以上方法,可以实现WiFi热点的创建、关闭以及状态监听,满足便携设备之间的文件传输需求。

    转载地址:http://wvwp.baihongyu.com/

    你可能感兴趣的文章
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
    查看>>