接着上一篇wifi的扫描连接等,这一篇主要说一下手机开启Wifi热点。

demo的下载地址会在最下面贴出来。

图片:

       

1 创建WIFI热点

经测试开启wifi热点(无秘密,wpa安全类型,wpa2安全类型)都可以正常开启并使用。

需要注意的是wifi和wifi热点不能同时打开,也就是连接wifi的时候,开启热点需要先将wifi关闭才可以。

用到的主要代码:

package com.vn.wifitest.utils;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.util.Log;public class WifiAPUtil {private static final String TAG = "WifiAPUtil";public final static boolean DEBUG = true;public static final int MESSAGE_AP_STATE_ENABLED = 1;public static final int MESSAGE_AP_STATE_FAILED = 2;//默认wifi秘密private static final String DEFAULT_AP_PASSWORD = "12345678";  private static WifiAPUtil sInstance;private static Handler mHandler;private static Context mContext;private WifiManager mWifiManager;//监听wifi热点的状态变化public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";public static final String EXTRA_WIFI_AP_STATE = "wifi_state";public static int WIFI_AP_STATE_DISABLING = 10;public static int WIFI_AP_STATE_DISABLED = 11;public static int WIFI_AP_STATE_ENABLING = 12;public static int WIFI_AP_STATE_ENABLED = 13;public static int WIFI_AP_STATE_FAILED = 14;public enum WifiSecurityType {WIFICIPHER_NOPASS, WIFICIPHER_WPA, WIFICIPHER_WEP, WIFICIPHER_INVALID, WIFICIPHER_WPA2}private WifiAPUtil(Context context) {if(DEBUG) Log.d(TAG,"WifiAPUtils construct"); mContext = context;mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);IntentFilter filter = new IntentFilter();filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);context.registerReceiver(mWifiStateBroadcastReceiver, filter);}protected void finalize() {if(DEBUG) Log.d(TAG,"finalize");mContext.unregisterReceiver(mWifiStateBroadcastReceiver);}public static WifiAPUtil getInstance(Context c) {if (null == sInstance)sInstance = new WifiAPUtil(c);return sInstance;}public boolean turnOnWifiAp(String str, String password,WifiSecurityType Type) {String ssid = str;//配置热点信息。WifiConfiguration wcfg = new WifiConfiguration();wcfg.SSID = new String(ssid);wcfg.networkId = 1;wcfg.allowedAuthAlgorithms.clear();wcfg.allowedGroupCiphers.clear();wcfg.allowedKeyManagement.clear();wcfg.allowedPairwiseCiphers.clear();wcfg.allowedProtocols.clear();if(Type == WifiSecurityType.WIFICIPHER_NOPASS) {if(DEBUG)Log.d(TAG, "wifi ap----no password");wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN, true);wcfg.wepKeys[0] = "";    wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);    wcfg.wepTxKeyIndex = 0;} else if(Type == WifiSecurityType.WIFICIPHER_WPA) {if(DEBUG)Log.d(TAG, "wifi ap----wpa");//密码至少8位,否则使用默认密码if(null != password && password.length() >= 8){wcfg.preSharedKey = password;} else {wcfg.preSharedKey = DEFAULT_AP_PASSWORD;}wcfg.hiddenSSID = false;       wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);       wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                             wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);     //wcfg.allowedKeyManagement.set(4);wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                        wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);      wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);    wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);    } else if(Type == WifiSecurityType.WIFICIPHER_WPA2) {if(DEBUG)Log.d(TAG, "wifi ap---- wpa2");//密码至少8位,否则使用默认密码if(null != password && password.length() >= 8){wcfg.preSharedKey = password;} else {wcfg.preSharedKey = DEFAULT_AP_PASSWORD;}     wcfg.hiddenSSID = true;       wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);       wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                             wcfg.allowedKeyManagement.set(4);     //wcfg.allowedKeyManagement.set(4);wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                        wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);      wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);    wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);    }     try {Method method = mWifiManager.getClass().getMethod("setWifiApConfiguration", wcfg.getClass());Boolean rt = (Boolean)method.invoke(mWifiManager, wcfg);if(DEBUG) Log.d(TAG, " rt = " + rt);} catch (NoSuchMethodException e) {Log.e(TAG, e.getMessage());} catch (IllegalArgumentException e) {Log.e(TAG, e.getMessage());} catch (IllegalAccessException e) {Log.e(TAG, e.getMessage());} catch (InvocationTargetException e) {Log.e(TAG, e.getMessage());}return setWifiApEnabled();}//获取热点状态  public int getWifiAPState() {int state = -1;try {Method method2 = mWifiManager.getClass().getMethod("getWifiApState");state = (Integer) method2.invoke(mWifiManager);} catch (Exception e) {Log.e(TAG, e.getMessage());}if(DEBUG)Log.i("WifiAP", "getWifiAPState.state " + state);return state;}private boolean setWifiApEnabled() {      //开启wifi热点需要关闭wifiwhile(mWifiManager.getWifiState() != WifiManager.WIFI_STATE_DISABLED){mWifiManager.setWifiEnabled(false);try {Thread.sleep(200);} catch (Exception e) {Log.e(TAG, e.getMessage());return false;}}// 确保wifi 热点关闭。while(getWifiAPState() != WIFI_AP_STATE_DISABLED){try {Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class, boolean.class);method1.invoke(mWifiManager, null, false);Thread.sleep(200);} catch (Exception e) {Log.e(TAG, e.getMessage());return false;}}//开启wifi热点try {Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class, boolean.class);method1.invoke(mWifiManager, null, true);      Thread.sleep(200);} catch (Exception e) {Log.e(TAG, e.getMessage());return false;}return true;} //关闭WiFi热点   public void closeWifiAp() {        if (getWifiAPState() != WIFI_AP_STATE_DISABLED) {    try {    Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");    method.setAccessible(true);    WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);    Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);    method2.invoke(mWifiManager, config, false);    } catch (NoSuchMethodException e) {    e.printStackTrace();    } catch (IllegalArgumentException e) {    e.printStackTrace();    } catch (IllegalAccessException e) {    e.printStackTrace();    } catch (InvocationTargetException e) {    e.printStackTrace();    }    }   }  public void regitsterHandler(Handler handler){mHandler = handler;}public void unregitsterHandler(){mHandler = null;}//监听wifi热点状态变化private BroadcastReceiver mWifiStateBroadcastReceiver = new BroadcastReceiver() {           @Overridepublic void onReceive(Context context, Intent intent) {if(DEBUG)Log.i(TAG,"WifiAPUtils onReceive: "+intent.getAction());if(WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {int cstate = intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1);if(cstate == WIFI_AP_STATE_ENABLED) {if(mHandler != null){mHandler.sendEmptyMessage(MESSAGE_AP_STATE_ENABLED);               }}if(cstate == WIFI_AP_STATE_DISABLED  || cstate == WIFI_AP_STATE_FAILED) {if(mHandler != null)mHandler.sendEmptyMessage(MESSAGE_AP_STATE_FAILED);}}}};//获取热点ssidpublic String getValidApSsid() {try {Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");WifiConfiguration configuration = (WifiConfiguration)method.invoke(mWifiManager);return configuration.SSID;  } catch (Exception e) {Log.e(TAG, e.getMessage());return null;}}//获取热点密码public String getValidPassword(){try {Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");WifiConfiguration configuration = (WifiConfiguration)method.invoke(mWifiManager);return configuration.preSharedKey;   } catch (Exception e) {Log.e(TAG, e.getMessage());return null;}}//获取热点安全类型public int getValidSecurity(){WifiConfiguration configuration;try {Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");configuration = (WifiConfiguration)method.invoke(mWifiManager);} catch (Exception e) {Log.e(TAG, e.getMessage());return WifiSecurityType.WIFICIPHER_INVALID.ordinal();}if(DEBUG)Log.i(TAG,"getSecurity security="+configuration.allowedKeyManagement);if(configuration.allowedKeyManagement.get(KeyMgmt.NONE)) {return WifiSecurityType.WIFICIPHER_NOPASS.ordinal();}else if(configuration.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {return WifiSecurityType.WIFICIPHER_WPA.ordinal();}else if(configuration.allowedKeyManagement.get(4)) { //4 means WPA2_PSK return WifiSecurityType.WIFICIPHER_WPA2.ordinal();}return WifiSecurityType.WIFICIPHER_INVALID.ordinal();}
}

使用方法:

Activity生命周期中

//初始化WifiAPUtil类
WifiAPUtil.getInstance(getApplicationContext())
//注册handler
WifiAPUtil.getInstance(this).regitsterHandler(mHandler);
//接收message,做处理
private Handler mHandler = new Handler(){public void handleMessage(Message msg) {switch (msg.what) {case WifiAPUtil.MESSAGE_AP_STATE_ENABLED:String ssid = WifiAPUtil.getInstance(WifiApActivity.this).getValidApSsid();String pw = WifiAPUtil.getInstance(WifiApActivity.this).getValidPassword();int security = WifiAPUtil.getInstance(WifiApActivity.this).getValidSecurity();mWifiApState.setText("wifi热点开启成功"+"\n"+"SSID = "+ssid+"\n"+"Password = "+pw +"\n"+"Security = "+security);break;case WifiAPUtil.MESSAGE_AP_STATE_FAILED:mWifiApState.setText("wifi热点关闭");break;default:break;}}
};

在activity销毁的时候

@Override
protected void onDestroy() {super.onDestroy();WifiAPUtil.getInstance(this).unregitsterHandler();
}

添加点击事件

//开启wifi热点
WifiAPUtil.getInstance(WifiApActivity.this).turnOnWifiAp(ssid, password, mWifiType);
//关闭wifi热点
WifiAPUtil.getInstance(WifiApActivity.this).closeWifiAp();

2 监听热点的状态

当wifi热点状态发送变化,系统会发送广播 android.net.wifi.WIFI_AP_STATE_CHANGED,所以我们只要注册监听这个广播就可以了。

wifi ap状态值。

public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
public static int WIFI_AP_STATE_DISABLING = 10;
public static int WIFI_AP_STATE_DISABLED = 11;
public static int WIFI_AP_STATE_ENABLING = 12;
public static int WIFI_AP_STATE_ENABLED = 13;
public static int WIFI_AP_STATE_FAILED = 14;

动态注册

public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
//注册广播接收者
IntentFilter filter = new IntentFilter();
filter.addAction(WIFI_AP_STATE_CHANGED_ACTION);
context.registerReceiver(mWifiStateBroadcastReceiver, filter);

广播接收者

通过监听wifiap状态的变化,发送消息给相关activity

//监听wifi热点状态变化
private BroadcastReceiver mWifiStateBroadcastReceiver = new BroadcastReceiver() {          @Overridepublic void onReceive(Context context, Intent intent) {if(DEBUG)Log.i(TAG,"WifiAPUtils onReceive: "+intent.getAction());if(WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {int cstate = intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1);if(cstate == WIFI_AP_STATE_ENABLED) {if(mHandler != null){mHandler.sendEmptyMessage(MESSAGE_AP_STATE_ENABLED);               }}if(cstate == WIFI_AP_STATE_DISABLED  || cstate == WIFI_AP_STATE_FAILED) {if(mHandler != null)mHandler.sendEmptyMessage(MESSAGE_AP_STATE_FAILED);}}}
};

3 遗留问题

在配置wificonfiguration的时候有过属性是hiddenSSID,这个是设置wifi热点AP是否隐藏的,

但是设置wcfg.hiddenSSID = true或false并没有发现有什么不同,按理说设置为true,ssid隐藏应该搜索不到这个热点,

但是都可以搜索到。还请知道的可以留言指教,十分感谢。

之前有朋友说5.0系统的开启热点有问题,我这里没有5.0的手机,使用华为p9Android6.0手机测试确实开启不了热点,需要添加write_settings,添加上此权限就可以成功开启了。

apk测试 低版本下载:链接: https://pan.baidu.com/s/1dzK3rEiwlaD0QrpWe-Vrgg 提取码: 1qpr

apk测试 8.0下载:链接:https://pan.baidu.com/s/14mQqiaaz5ik0vht8MSYDpg 提取码:dwat

DEMO下载

Android WiFi开发 (二)Wifi热点相关推荐

  1. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  2. WIFI性能测试二 --- wifi的ANI功能

    WIFI性能测试二 --- wifi的ANI功能 最近解决公司wifi产品经常断线和连接不稳定时,查阅了一些资料,现总结记录如下: 1. wifi的ANI功能 参考链接: http://gregsow ...

  3. Android画板开发(二) 橡皮擦实现

    Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...

  4. 【 Android11 WiFi开发 二 】WiFi连接、断开

    前言 上篇文章介绍了WiFi列表的获取与展示和WiFi状态改变的广播监听,本篇将介绍介绍对WiFi的操作,连接.忘记,查看已连接的WiFi信息等. 相关文章 1.[ Android11 WiFi开发 ...

  5. Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 上一章中,我们已经学习了传统蓝牙的开发,这一章,我们来学习如 ...

  6. 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi ) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/andr ...

  7. CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

    本文参考鸿洋大大的链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得 ...

  8. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  9. 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  10. Android添加拍照功能,Android相机开发(二): 给相机加上偏好设置

    Android Camera Develop: add settings to camera app 概述 继上一篇实现了一个最简单的相机APP后,本篇主要介绍实现相机的各种偏好设置,比如分辨率.闪光 ...

最新文章

  1. java作为kafka生产者实验及Expiring超时问题解决
  2. 输入参数的数目不足 matlab_哈工大被禁用MATLAB,工科学生慌了,论文至上间接导致软件依赖?...
  3. cups源码下载 linux_【正点原子FPGA连载】第九章Linux显示设备的使用-领航者ZYNQ之linux开发指南...
  4. Java虚拟机10:类加载器
  5. 直播P2P技术1-技术入门
  6. oracle更新视图。
  7. 笔记本暗屏维修多少钱_电视机烧了维修多少钱?
  8. 计算机一级cad试题,全国计算机等级考试一级试题与答案(25套)(1)2
  9. 各个浏览器的详细信息
  10. oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
  11. JS通过WebSocket实现双屏信息同步显示
  12. 北京CMMB信号ESG的Schedule据文件--8月份数据
  13. DNS Client Events 1014
  14. 记录Ok6410 sd 启动uboot
  15. bell-lapadula vs biba
  16. Web前端-html页面-01(锚点、表单、个人简历)
  17. 【译文】利用STAN做贝叶斯回归分析:Part 1 正态回归
  18. 计算机芯片制造原理,从沙粒到芯片,原来CPU制造工序过程是这样的(视频)
  19. PS安装插件提示无法加载扩展未正确签署解决方式(适用于mac/win)
  20. euclidea4攻略_Euclidea几何构建10.4通关攻略

热门文章

  1. 类实例:个人银行综合实例
  2. U盘总是提示格式化,如何安全恢复里面的数据?
  3. 支持 Linux OS的免费SCADA软件列表
  4. 微信小程序胶囊提示气泡
  5. 第一台计算机是怎么样的
  6. 中国的亲戚关系您理顺了吗
  7. JS遍历数组,删除数组元素时,怎么删都会漏掉一个的原因
  8. 实现微信中的聊天界面Demo
  9. tkinter绘制组件(12)——表格
  10. Android invalidate/postInvalidate/requestLayout 彻底厘清