这个例子是从网上找的,我给重新优化了下。这里有个问题是只能连接到之前已经连接过的wifi,目前还没找到连接到陌生wifi(有/无密码)的方法。总之慢慢来吧~

说下思路:

1.通过wifiManager来查找想要链接的wifi是否是之前已经连过的,如果是就进行下一步

2.查找想要链接的wifi名字是否在可搜索的范围内,也就是当前是否可以搜到,如果能搜到就可以连接了

3.通过WifiManager.enableNetwork(getWifiConfigurated(wifi_SSID), true);来连接到指定网络

PS:这里动态注册了一个广播来监听wifi的变化,能比较直观的现实wifi的变化

MainActivity.java

  1. package com.example.testforwifilinkdemo;
  2.  
  3. import android.app.Activity;
  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.IntentFilter;
  8. import android.net.ConnectivityManager;
  9. import android.net.NetworkInfo;
  10. import android.net.wifi.WifiInfo;
  11. import android.os.Bundle;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.Button;
  15.  
  16. public class LinkWifiActivity extends Activity {
  17.  
  18. private WifiAdmin wifiAdmin;
  19. //这里写想要链接的wifi名字
  20. private final static String TAG_SSID = "CMCC-EDU";
  21.  
  22. //判断是否连接上制定的wifi
  23. private boolean isConnected = false;
  24.  
  25. private BroadcastReceiver wifiConnectReceiver;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_link_wifi);
  31.  
  32. wifiAdmin = new WifiAdmin(LinkWifiActivity.this);
  33.  
  34. wifiConnectReceiver = new WifiConnectReceiver();
  35.  
  36. IntentFilter filter = new IntentFilter();
  37. filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  38. LinkWifiActivity.this.registerReceiver(wifiConnectReceiver, filter);//注册广播
  39.  
  40. Button linkBtn = (Button) findViewById(R.id.linkWifiBtn);
  41. linkBtn.setOnClickListener(new OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. connectToTagWifi(TAG_SSID);
  45. }
  46. });
  47. }
  48.  
  49. class WifiConnectReceiver extends BroadcastReceiver {
  50. @Override
  51. public void onReceive(Context context, Intent intent) {
  52. String action = intent.getAction();
  53. if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
  54. ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
  55. NetworkInfo notewokInfo = manager.getActiveNetworkInfo();
  56. if (notewokInfo != null) {
  57. System.out.println("notewokInfo.getExtraInfo()------->"+ notewokInfo.getExtraInfo());
  58. WifiInfo currentWifiInfo = wifiAdmin.getCurrentWifiInfo();
  59. System.out.println("currentWifiInfo.getSSID()----->"+ currentWifiInfo.getSSID());
  60. if (currentWifiInfo.getSSID().equals("\"" + TAG_SSID + "\"")) {
  61. isConnected = true;
  62. }
  63. } else {
  64. System.out.println("notewokInfo is null");
  65. }
  66. }
  67. }
  68.  
  69. }
  70.  
  71. @Override
  72. protected void onDestroy() {
  73. super.onDestroy();
  74. LinkWifiActivity.this.unregisterReceiver(wifiConnectReceiver);//取消广播
  75. }
  76.  
  77. /**
  78. * @param wifi_SSID
  79. * 关键代码
  80. */
  81. public void connectToTagWifi(String wifi_SSID) {
  82. System.out.println("正在努力连接到指定的wifi");
  83. wifiAdmin.connectConfiguratedWifi(TAG_SSID);
  84.  
  85. }
  86.  
  87. }

工具类:WifiAdmin.java

  1. package com.example.testforwifilinkdemo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.content.Context;
  7. import android.net.wifi.ScanResult;
  8. import android.net.wifi.WifiConfiguration;
  9. import android.net.wifi.WifiInfo;
  10. import android.net.wifi.WifiManager;
  11. import android.net.wifi.WifiManager.WifiLock;
  12. import android.util.Log;
  13.  
  14. public class WifiAdmin {
  15. private final static String TAG = "WifiAdmin";
  16. public static final int IS_OPENING = 1,IS_CLOSING = 2,IS_OPENED = 3,IS_CLOSED = 4;
  17.  
  18. private StringBuffer mStringBuffer = new StringBuffer();
  19. private List<ScanResult> scanResultList;
  20. private ScanResult mScanResult;
  21. // 定义WifiManager对象
  22. private WifiManager mWifiManager;
  23. // 定义WifiInfo对象
  24. private WifiInfo mWifiInfo;
  25. // 网络连接列表
  26. private List<WifiConfiguration> mWifiConfigList;
  27. // 定义一个WifiLock
  28. WifiLock mWifiLock;
  29.  
  30. /**
  31. * 构造方法
  32. */
  33. public WifiAdmin(Context context) {
  34. mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  35. mWifiInfo = mWifiManager.getConnectionInfo();
  36. mWifiConfigList = mWifiManager.getConfiguredNetworks();
  37. }
  38.  
  39. /**
  40. * 打开Wifi网卡,能打开就返回true,无法打开返回false
  41. */
  42. public boolean openNetCard() {
  43. if (!mWifiManager.isWifiEnabled()) {
  44. return mWifiManager.setWifiEnabled(true);
  45. }
  46. else{
  47. return false;
  48. }
  49. }
  50.  
  51. /**
  52. * 关闭Wifi网卡,能关闭返回true,不能关就返回false
  53. */
  54. public boolean closeNetCard() {
  55. if (mWifiManager.isWifiEnabled()) {
  56. return mWifiManager.setWifiEnabled(false);
  57. }
  58. else{
  59. return false;
  60. }
  61. }
  62.  
  63. /**
  64. * 检查当前Wifi网卡状态,返回四种状态,如果出错返回-1
  65. */
  66. public int getWifitate() {
  67. int result = -1;
  68. switch (mWifiManager.getWifiState()) {
  69. case 0:
  70. Log.i(TAG, "网卡正在关闭");
  71. result = IS_CLOSING;
  72. break;
  73. case 1:
  74. Log.i(TAG, "网卡已经关闭");
  75. result = IS_CLOSED;
  76. break;
  77. case 2:
  78. Log.i(TAG, "网卡正在打开");
  79. result = IS_OPENING;
  80. break;
  81. case 3:
  82. Log.i(TAG, "网卡已经打开");
  83. result = IS_OPENED;
  84. break;
  85. default:
  86. Log.i(TAG, "---_---晕......没有获取到状态---_---");
  87. result = -1;
  88. break;
  89. }
  90. return result;
  91. }
  92.  
  93. /**
  94. * 扫描周边网络,判断周边是否有wifi,有就返回true,没有就返回false
  95. */
  96. public boolean scan() {
  97. if (getWifitate() == IS_OPENED) {
  98. //开始扫描
  99. mWifiManager.startScan();
  100. //将扫描结果存入数据列中
  101. scanResultList = mWifiManager.getScanResults();
  102. if (scanResultList != null) {
  103. return true;
  104. }
  105. }
  106. return false;
  107. }
  108.  
  109. /**
  110. * 得到附近wifi的扫描结果,是ScanResult对象
  111. * 得到的是附近网络的结果集,没有就返回null
  112. */
  113. public ArrayList<ScanResult> getScanResult() {
  114. // 每次点击扫描之前清空上一次的扫描结果
  115. if (mStringBuffer != null) {
  116. mStringBuffer = new StringBuffer();
  117. }
  118.  
  119. scan();// 开始扫描网络
  120. ArrayList<ScanResult> scanResultsList = new ArrayList<ScanResult>();
  121. if (scanResultList != null) {
  122. for (int i = 0; i < scanResultList.size(); i++) {
  123. mScanResult = scanResultList.get(i);
  124. scanResultsList.add(mScanResult);
  125.  
  126. /*mStringBuffer = mStringBuffer.append("NO.").append(i)
  127. .append(" :")
  128. .append(mScanResult.SSID).append("->")
  129. .append(mScanResult.BSSID).append("->")
  130. .append(mScanResult.capabilities).append("->")
  131. .append(mScanResult.frequency).append("->")
  132. .append(mScanResult.level).append("->")
  133. .append(mScanResult.describeContents()).append("\n\n");*/
  134. }
  135. //Log.i(TAG, mStringBuffer.toString());
  136. return scanResultsList;
  137. }
  138. else {
  139. return null;
  140. }
  141. }
  142.  
  143. /**
  144. * 判断指定的网络是否能被扫描到
  145. * @param wifi_SSID
  146. * @return 如果能够在周边发现指定的网络就返回true,否则返回false
  147. */
  148. public boolean canScannable(String wifi_SSID) {
  149. boolean canScannable = false;
  150. scan();//开始扫描周边网络
  151. //得到扫描到的wifi列表
  152. if (scanResultList != null) {
  153. for (int i = 0; i < scanResultList.size(); i++) {
  154. System.out.println("scanResultList " + i + "----->" + scanResultList.get(i).SSID);
  155. if (scanResultList.get(i).SSID.equals(wifi_SSID)) {
  156. canScannable = true;//如果想要链接的wifi能够扫描到,那么就说明能够链接
  157. break;
  158. }
  159. }
  160. }
  161. return canScannable;
  162. }
  163.  
  164. /**
  165. * 得到指定网络的index(从0开始计数),找不到就返回-1
  166. */
  167. public int getTagWifiId(String netName){
  168. // 开始扫描网络
  169. scan();
  170. scanResultList = mWifiManager.getScanResults();
  171. if (scanResultList != null) {
  172. for (int i = 0; i < scanResultList.size(); i++) {
  173. mScanResult = scanResultList.get(i);
  174. if(mScanResult.SSID.equals(netName)){
  175. return i;
  176. }
  177. String show = "No = "+i +
  178. " SSID = "+mScanResult.SSID +
  179. " capabilities = "+mScanResult.capabilities +
  180. " level = "+mScanResult.level;
  181. Log.i(TAG, show);
  182. }
  183. }
  184. return -1;
  185. }
  186.  
  187. /**
  188. * 断开当前连接的网络
  189. */
  190. public void disconnectWifi() {
  191. int netId = getCurrentNetworkId();
  192. mWifiManager.disableNetwork(netId);
  193. mWifiManager.disconnect();
  194. mWifiInfo = null;
  195. }
  196.  
  197. /**
  198. * 检查当前网络状态
  199. * 如果有wifi链接,返回true,如果没有就返回false
  200. */
  201. public boolean getWifiConnectState() {
  202. return mWifiInfo != null ? true : false;
  203. }
  204.  
  205. /**
  206. * @return 当前网络的名字,如果没有就返回null,否则返回string
  207. */
  208. public String getCurrentSSID(){
  209. return (mWifiInfo == null) ? null :mWifiInfo.getSSID();
  210. }
  211.  
  212. /**
  213. * 得到连接的ID,如果没有就返回0,否则返回正确的id
  214. */
  215. public int getCurrentNetworkId() {
  216. return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
  217. }
  218.  
  219. /**
  220. * 得到IP地址,出错时返回0
  221. */
  222. public int getCurrentIPAddress() {
  223. return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
  224. }
  225.  
  226. /**
  227. * 得到MAC地址
  228. * @return 出錯了返回null
  229. */
  230. public String getCurrentMacAddress() {
  231. return (mWifiInfo == null) ? null : mWifiInfo.getMacAddress();
  232. }
  233.  
  234. /**
  235. * 得到接入点的BSSID
  236. * @return 出錯返回null
  237. */
  238. public String getCurrentBSSID() {
  239. return (mWifiInfo == null) ? null : mWifiInfo.getBSSID();
  240. }
  241.  
  242. /**
  243. * 得到WifiInfo的所有信息包
  244. * @return 出错了返回null
  245. */
  246. public WifiInfo getCurrentWifiInfo() {
  247. return (mWifiInfo == null) ? null : mWifiInfo;
  248. }
  249.  
  250. // 锁定WifiLock
  251. public void acquireWifiLock() {
  252. mWifiLock.acquire();
  253. }
  254.  
  255. // 解锁WifiLock
  256. public void releaseWifiLock() {
  257. // 判断时候锁定
  258. if (mWifiLock.isHeld()) {
  259. mWifiLock.acquire();
  260. }
  261. }
  262.  
  263. // 创建一个WifiLock
  264. public void creatWifiLock() {
  265. mWifiLock = mWifiManager.createWifiLock("Test");
  266. }
  267.  
  268. // 得到配置好的网络
  269. public List<WifiConfiguration> getConfiguration() {
  270. return mWifiConfigList;
  271. }
  272.  
  273. /**
  274. * @param index
  275. * @return 没有连接到返回false,正在连接则返回true
  276. */
  277. public boolean connectConfiguratedWifi(String wifi_SSID) {
  278. //如果当前网络不是想要链接的网络,要连接的网络是配置过的,并且要连接的网络能够被扫描到
  279. if (getCurrentSSID().indexOf(wifi_SSID) == -1 ) {
  280. if (getWifiConfigurated(wifi_SSID) != -1 && canScannable(wifi_SSID)) {
  281. mWifiManager.enableNetwork(getWifiConfigurated(wifi_SSID), true);
  282. }
  283. else {
  284. return false;
  285. }
  286. }
  287. return true;
  288. }
  289.  
  290. /**
  291. * 判断要连接的wifi名是否已经配置过了
  292. * @return 返回要连接的wifi的ID,如果找不到就返回-1
  293. */
  294. public int getWifiConfigurated(String wifi_SSID) {
  295. int id = -1;
  296. if (mWifiConfigList != null) {
  297. for (int j = 0; j < mWifiConfigList.size(); j++) {
  298. if (mWifiConfigList.get(j).SSID.equals("\"" + wifi_SSID + "\"")) {
  299. //如果要连接的wifi在已经配置好的列表中,那就设置允许链接,并且得到id
  300. id = mWifiConfigList.get(j).networkId;
  301. break;
  302. }
  303. }
  304. }
  305. return id;
  306. }
  307.  
  308. }

源码下载:http://download.csdn.net/detail/shark0017/7962497

让手机连接到指定的WIFI网络,适用于之前已经连过的网络的更多相关文章

  1. Android自动连接指定的wifi,免密码或指定密码

    一.运行时的状态 遇到一个这样的要求:“不进行扫描操作,怎么对指定的免密码WIFI进行连接(之前没有连接过)”,于是动手写了一个Demo,如图所示未连接成功时的状态,第一个编辑框让用户输入SSID,第 ...

  2. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...

  3. 手机连接wifi自动弹窗的原理及其实现方案

    一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...

  4. 【转】Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...

  5. 手机连接WiFi有感叹号x怎么回事?如何消除手机WiFi感叹号?

    经过多年的革新,现在的安卓系统已经非常优秀了,某些程度已经超越iOS,卡顿和耗电也不再是安卓系统的代名词了.而为了体验到最优秀的安卓系统,不少人都会购买海外的手机,因为海外手机的安卓系统都比较精简,非 ...

  6. 【Android开发—智能家居系列】(三):手机连接WIFI模块

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有 ...

  7. 为什么手机连接wifi会显示已停用?

    1.通常导致手机连接WiFi显示“已停用”故障的原因是由于无线路由器“安全模式”设置不当造成的,对此我们可以通过以下方法来解决: 2.根据无线路由器背面的信息(包括路由器IP地址,登陆用户名和密码), ...

  8. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...

  9. 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...

随机推荐

  1. Elasticsearch常用最全最常用工具清单

    https://blog.csdn.net/ZYC88888/article/details/82872558

  2. vue1.0

    vue1.0学习总结   前言 使用vue已经有三.四个月了,但是只是学着使用了一些基本方法.因为现在的前端框架越来越多(Angular,React...),但是我相信万变不离其宗,很多用法框架之间还 ...

  3. 【struts2基础】配置详解

    一.struts2工作原理(网友总结,千遍一律) 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Action ...

  4. 暴力探测蓝牙设备工具redfang

    暴力探测蓝牙设备工具redfang   根据是否可以被扫描到,蓝牙设备具有可见(Disoverable)和不可见(non discoverable)两种模式.为了扫描不可见蓝牙设备,Kali Linu ...

  5. 无线网卡服务端工具airserv-ng

    无线网卡服务端工具airserv-ng   由于WiFi信号强度的限制,渗透测试人员只能监听主机周边范围的无线信号.为了解决这个问题,aircrack-ng套件提供了一个无线网卡服务端工具airser ...

  6. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  7. HDU.5819.Knights(概率DP)

    题目链接 参考一下这的. \(Description\) 数轴上有n个骑士,分别位于1,2,3,...,n,它们的移动速度相同,初始移动方向已知.当两个骑士相遇时,各有50%的概率获胜,失败的骑士就死 ...

  8. Codeforces Beta Round #14 (Div. 2) D. Two Paths 树形dp

    D. Two Paths 题目连接: http://codeforces.com/contest/14/problem/D Description As you know, Bob's brother ...

  9. BZOJ 4636: 蒟蒻的数列 分块

    4636: 蒟蒻的数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4636 Description 蒟蒻DCrusher不仅喜欢玩扑克 ...

  10. hdu 5726 tetrahedron 立体几何

    tetrahedron/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Given four p ...