wifi热点创建和自动连接

分类: Android 226人阅读 评论(0) 收藏 举报 [java] view plain copy
  1. 1.wifi热点的创建

  2. /**

  3. * 创建wifi热点

  4. * @param ssid 热点信息

  5. * @param passwd 密码

  6. * @author wanghongbin

  7. */

  8. publicvoid startWifiAp(Context context, String ssid, String passwd) {

  9. //关闭wifi

  10. closeWifi();

  11. //关闭热点

  12. closeWifiAp();

  13. //激活热点

  14. invokeWifiAp(ssid, passwd);

  15. }

  16. /**

  17. * 激活wifi热点

  18. * @param ssid

  19. * @param passwd

  20. * @author wanghongbin

  21. */

  22. privatevoid invokeWifiAp(String ssid, String passwd) {

  23. try {

  24. Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",

  25. WifiConfiguration.class, boolean.class);

  26. WifiConfiguration netConfig = new WifiConfiguration();

  27. netConfig.SSID = ssid;

  28. netConfig.preSharedKey = passwd ;

  29. //启动热点

  30. boolean isSuccess = (Boolean)method1.invoke(mWifiManager, netConfig, true);

  31. Log.i(TAG, "whb end startWifiAp isSuccess="+isSuccess);

  32. } catch (IllegalArgumentException e) {

  33. // TODO Auto-generated catch block

  34. e.printStackTrace();

  35. Log.i(TAG, "whb end startWifiAp IllegalArgumentException");

  36. } catch (IllegalAcces***ception e) {

  37. // TODO Auto-generated catch block

  38. e.printStackTrace();

  39. Log.i(TAG, "whb end startWifiAp IllegalAcces***ception");

  40. } catch (InvocationTargetException e) {

  41. // TODO Auto-generated catch block

  42. e.printStackTrace();

  43. // onNotifyWifiNotSurpport();

  44. Log.i(TAG, "whb end startWifiAp onNotifyWifiNotSurpport");

  45. } catch (SecurityException e) {

  46. // TODO Auto-generated catch block

  47. e.printStackTrace();

  48. Log.i(TAG, "whb end startWifiAp SecurityException");

  49. } catch (NoSuchMethodException e) {

  50. // TODO Auto-generated catch block

  51. e.printStackTrace();

  52. onNotifyWifiNotSurpport();

  53. Log.i(TAG, "whb end startWifiAp NoSuchMethodException");

  54. }

  55. }

  56. // 关闭WIFI

  57. publicvoid closeWifi() {

  58. if (mWifiManager.isWifiEnabled()) {

  59. mWifiManager.setWifiEnabled(false);

  60. }

  61. }

  62. //作热点之前先关闭wifi热点服务

  63. publicvoid closeWifiAp( ) {

  64. if (isWifiApEnabled()) {

  65. try {

  66. Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");

  67. method.setAccessible(true);

  68. WifiConfiguration config = (WifiConfiguration) method.invoke(mWifiManager);

  69. Method method2 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);

  70. method2.invoke(mWifiManager, config, false);

  71. } catch (NoSuchMethodException e) {

  72. // TODO Auto-generated catch block

  73. e.printStackTrace();

  74. } catch (IllegalArgumentException e) {

  75. // TODO Auto-generated catch block

  76. e.printStackTrace();

  77. } catch (IllegalAcces***ception e) {

  78. // TODO Auto-generated catch block

  79. e.printStackTrace();

  80. } catch (InvocationTargetException e) {

  81. // TODO Auto-generated catch block

  82. e.printStackTrace();

  83. }

  84. }

  85. }

  86. 2.连接热点

  87. /**

  88. * 添加一个网络节点并连接

  89. * @param ssid wifi节点名称

  90. * @param passwd 密码

  91. * @param type : TYPE_WEP TYPE_WPA

  92. */

  93. publicvoid addNetwork(Context context, String ssid, String passwd, int type) {

  94. closeWifiAp();

  95. openWifi();

  96. mConfig = createWifiInfo(ssid, passwd, type);

  97. SSID = ssid;

  98. connectToWifiWithConfiguration(mConfig);

  99. }

  100. publicstaticfinalint WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds

  101. publicstaticfinalint WIFI_SCAN_TIMEOUT = 20 * 1000;

  102. /**

  103. * 连接指定热点

  104. * @param config

  105. * @return true : 调用函数成功,具体网络状态还得检测

  106. * @author wanghongbin 这个函数害死人阿,网上看了半天也没人说,最后是看的源代码里的WifiConnectionTest.java才明白需要等待,步步等待,步步惊心

  107. */

  108. publicboolean connectToWifiWithConfiguration(WifiConfiguration config) {

  109. String ssid = config.SSID;

  110. config.SSID = "\""+ssid+"\"";

  111. //If Wifi is not enabled, enable it

  112. if (!mWifiManager.isWifiEnabled()) {

  113. Log.v(TAG, "Wifi is not enabled, enable it");

  114. mWifiManager.setWifiEnabled(true);

  115. }

  116. List<ScanResult> netList = mWifiManager.getScanResults();

  117. if (netList == null) {

  118. Log.v(TAG, "scan results are null");

  119. // if no scan results are available, start active scan

  120. mWifiManager.startScan();

  121. boolean mScanResultIsAvailable = false;

  122. long startTime = System.currentTimeMillis();

  123. while (!mScanResultIsAvailable) {

  124. if ((System.currentTimeMillis() - startTime) > WIFI_SCAN_TIMEOUT) {

  125. returnfalse;

  126. }

  127. // wait for the scan results to be available

  128. synchronized (this) {

  129. // wait for the scan result to be available

  130. try {

  131. this.wait(WAIT_FOR_SCAN_RESULT);

  132. } catch (InterruptedException e) {

  133. e.printStackTrace();

  134. }

  135. if ((mWifiManager.getScanResults() == null) ||

  136. (mWifiManager.getScanResults().size() <= 0)) {

  137. continue;

  138. }

  139. mScanResultIsAvailable = true;

  140. }

  141. }

  142. }

  143. netList = mWifiManager.getScanResults();

  144. for (int i = 0; i < netList.size(); i++) {

  145. ScanResult sr= netList.get(i);

  146. if (sr.SSID.equals(ssid)) {

  147. Log.v(TAG, "found " + ssid + " in the scan result list");

  148. int networkId = mWifiManager.addNetwork(config);

  149. // Connect to network by disabling others.

  150. mWifiManager.enableNetwork(networkId, true);

  151. mWifiManager.saveConfiguration();

  152. mWifiManager.reconnect();

  153. break;

  154. }

  155. }

  156. List<WifiConfiguration> netConfList = mWifiManager.getConfiguredNetworks();

  157. if (netConfList.size() <= 0) {

  158. Log.v(TAG, ssid + " is not available");

  159. returnfalse;

  160. }

  161. returntrue;

  162. }

  163. publicstaticfinalint TYPE_NO_PASSWD = 0x11;

  164. publicstaticfinalint TYPE_WEP = 0x12;

  165. publicstaticfinalint TYPE_WPA = 0x13;

  166. /**

  167. * 连接信息生成配置对象

  168. * @param SSID

  169. * @param password

  170. * @param type

  171. * @return

  172. * @author wanghongbin

  173. */

  174. public WifiConfiguration createWifiInfo(String SSID, String password, int type) {

  175. Log.v(TAG, "whb SSID =" + SSID + "## Password =" + password + "## Type = " + type);

  176. WifiConfiguration config = new WifiConfiguration();

  177. config.SSID = SSID;

  178. clearAll(SSID);

  179. // 分为三种情况:1没有密码2用wep加密3用wpa加密

  180. if (type == TYPE_NO_PASSWD) {// WIFICIPHER_NOPASS

  181. config.hiddenSSID = false;

  182. config.status = WifiConfiguration.Status.ENABLED;

  183. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

  184. config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

  185. config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

  186. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

  187. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

  188. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

  189. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

  190. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

  191. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

  192. config.preSharedKey = null;

  193. } elseif (type == TYPE_WEP) { // WIFICIPHER_WEP

  194. config.hiddenSSID = true;

  195. config.wepKeys[0] = "\"" + password + "\"";

  196. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);

  197. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

  198. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

  199. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

  200. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

  201. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

  202. config.wepTxKeyIndex = 0;

  203. } elseif (type == TYPE_WPA) { // WIFICIPHER_WPA

  204. config.preSharedKey = "\"" + password + "\"";

  205. config.hiddenSSID = false;

  206. config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

  207. config.priority = 10000;

  208. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

  209. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

  210. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

  211. config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

  212. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

  213. config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

  214. config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

  215. config.status = WifiConfiguration.Status.ENABLED;

  216. }

  217. return config;

  218. }

  219. 3.很多之前已经连接上的WIFI,配置信息会自动保存,当你关闭---->打开WIFI时就会自动连接,但有时我们并不希望这样处理,解决方法为在打开WIFI之前将以前所保存的信息清除,代码为

  220. if(isWifiConnect()){

  221. WifiInfo info = mWifiManager.getConnectionInfo();

  222. mWifiManager.removeNetwork(info.getNetworkId());

  223. mWifiManager.saveConfiguration();

  224. }

  225. 或者

  226. /**

  227. * 移除所有同名节点

  228. * @param SSID

  229. */

  230. privatevoid clearAll(String SSID) {

  231. List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();

  232. //按照networkId从大到小排序

  233. Collections.sort(existingConfigs, new ComparatorConfig());

  234. for (WifiConfiguration existingConfig : existingConfigs) {

  235. LogHelper.i(TAG,"existingConfig.SSID="+existingConfig.SSID+",netID = "+ existingConfig.networkId);

  236. if (existingConfig.SSID.equals("\""+SSID+"\"") /*&& existingConfig.preSharedKey.equals("\"" + password + "\"")*/) {

  237. mWifiManager.disableNetwork(existingConfig.networkId);

  238. mWifiManager.removeNetwork(existingConfig.networkId);

  239. }

  240. }

  241. mWifiManager.saveConfiguration();

  242. }


更多相关文章

  1. Android(安卓)Design Support Library(2)- TextInputLayout的使用
  2. Android登录注册功能 数据库SQLite验证
  3. 如何分析解决Android(安卓)ANR
  4. Android中实现全屏显示的方法
  5. Android(安卓)unity3d 输入框
  6. Android(安卓)Studio Mac快捷键
  7. 简单安卓QQ登录界面
  8. [置顶] Android(安卓)错误信息捕获发送至服务器
  9. 破解android锁屏密码

随机推荐

  1. eclipse使用appcompat_v7库无法找到andro
  2. 两个星期的Android开发
  3. AndroidStudio导入新项目一直卡在Buildin
  4. Android术语小全,推荐一下(改日在翻译).
  5. Android开发学习 之 一、开发环境的搭建
  6. Android软件开发之获取通讯录联系人信息
  7. Android(安卓)调用系统Camera
  8. Android开发EditText属性
  9. Android教程之android数据库编程
  10. Android中不常见的监听: 鼠标划过/双击/右