让手机连接到指定的WIFI网络,适用于之前已经连过的网络
这个例子是从网上找的,我给重新优化了下。这里有个问题是只能连接到之前已经连接过的wifi,目前还没找到连接到陌生wifi(有/无密码)的方法。总之慢慢来吧~
说下思路:
1.通过wifiManager来查找想要链接的wifi是否是之前已经连过的,如果是就进行下一步
2.查找想要链接的wifi名字是否在可搜索的范围内,也就是当前是否可以搜到,如果能搜到就可以连接了
3.通过WifiManager.enableNetwork(getWifiConfigurated(wifi_SSID), true);来连接到指定网络
PS:这里动态注册了一个广播来监听wifi的变化,能比较直观的现实wifi的变化
MainActivity.java
package com.example.testforwifilinkdemo; import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class LinkWifiActivity extends Activity { private WifiAdmin wifiAdmin;
//这里写想要链接的wifi名字
private final static String TAG_SSID = "CMCC-EDU"; //判断是否连接上制定的wifi
private boolean isConnected = false; private BroadcastReceiver wifiConnectReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_link_wifi); wifiAdmin = new WifiAdmin(LinkWifiActivity.this); wifiConnectReceiver = new WifiConnectReceiver(); IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
LinkWifiActivity.this.registerReceiver(wifiConnectReceiver, filter);//注册广播 Button linkBtn = (Button) findViewById(R.id.linkWifiBtn);
linkBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
connectToTagWifi(TAG_SSID);
}
});
} class WifiConnectReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo notewokInfo = manager.getActiveNetworkInfo();
if (notewokInfo != null) {
System.out.println("notewokInfo.getExtraInfo()------->"+ notewokInfo.getExtraInfo());
WifiInfo currentWifiInfo = wifiAdmin.getCurrentWifiInfo();
System.out.println("currentWifiInfo.getSSID()----->"+ currentWifiInfo.getSSID());
if (currentWifiInfo.getSSID().equals("\"" + TAG_SSID + "\"")) {
isConnected = true;
}
} else {
System.out.println("notewokInfo is null");
}
}
} } @Override
protected void onDestroy() {
super.onDestroy();
LinkWifiActivity.this.unregisterReceiver(wifiConnectReceiver);//取消广播
} /**
* @param wifi_SSID
* 关键代码
*/
public void connectToTagWifi(String wifi_SSID) {
System.out.println("正在努力连接到指定的wifi");
wifiAdmin.connectConfiguratedWifi(TAG_SSID); } }
工具类:WifiAdmin.java
package com.example.testforwifilinkdemo; import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.util.Log; public class WifiAdmin {
private final static String TAG = "WifiAdmin";
public static final int IS_OPENING = 1,IS_CLOSING = 2,IS_OPENED = 3,IS_CLOSED = 4; private StringBuffer mStringBuffer = new StringBuffer();
private List<ScanResult> scanResultList;
private ScanResult mScanResult;
// 定义WifiManager对象
private WifiManager mWifiManager;
// 定义WifiInfo对象
private WifiInfo mWifiInfo;
// 网络连接列表
private List<WifiConfiguration> mWifiConfigList;
// 定义一个WifiLock
WifiLock mWifiLock; /**
* 构造方法
*/
public WifiAdmin(Context context) {
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mWifiInfo = mWifiManager.getConnectionInfo();
mWifiConfigList = mWifiManager.getConfiguredNetworks();
} /**
* 打开Wifi网卡,能打开就返回true,无法打开返回false
*/
public boolean openNetCard() {
if (!mWifiManager.isWifiEnabled()) {
return mWifiManager.setWifiEnabled(true);
}
else{
return false;
}
} /**
* 关闭Wifi网卡,能关闭返回true,不能关就返回false
*/
public boolean closeNetCard() {
if (mWifiManager.isWifiEnabled()) {
return mWifiManager.setWifiEnabled(false);
}
else{
return false;
}
} /**
* 检查当前Wifi网卡状态,返回四种状态,如果出错返回-1
*/
public int getWifitate() {
int result = -1;
switch (mWifiManager.getWifiState()) {
case 0:
Log.i(TAG, "网卡正在关闭");
result = IS_CLOSING;
break;
case 1:
Log.i(TAG, "网卡已经关闭");
result = IS_CLOSED;
break;
case 2:
Log.i(TAG, "网卡正在打开");
result = IS_OPENING;
break;
case 3:
Log.i(TAG, "网卡已经打开");
result = IS_OPENED;
break;
default:
Log.i(TAG, "---_---晕......没有获取到状态---_---");
result = -1;
break;
}
return result;
} /**
* 扫描周边网络,判断周边是否有wifi,有就返回true,没有就返回false
*/
public boolean scan() {
if (getWifitate() == IS_OPENED) {
//开始扫描
mWifiManager.startScan();
//将扫描结果存入数据列中
scanResultList = mWifiManager.getScanResults();
if (scanResultList != null) {
return true;
}
}
return false;
} /**
* 得到附近wifi的扫描结果,是ScanResult对象
* 得到的是附近网络的结果集,没有就返回null
*/
public ArrayList<ScanResult> getScanResult() {
// 每次点击扫描之前清空上一次的扫描结果
if (mStringBuffer != null) {
mStringBuffer = new StringBuffer();
} scan();// 开始扫描网络
ArrayList<ScanResult> scanResultsList = new ArrayList<ScanResult>();
if (scanResultList != null) {
for (int i = 0; i < scanResultList.size(); i++) {
mScanResult = scanResultList.get(i);
scanResultsList.add(mScanResult); /*mStringBuffer = mStringBuffer.append("NO.").append(i)
.append(" :")
.append(mScanResult.SSID).append("->")
.append(mScanResult.BSSID).append("->")
.append(mScanResult.capabilities).append("->")
.append(mScanResult.frequency).append("->")
.append(mScanResult.level).append("->")
.append(mScanResult.describeContents()).append("\n\n");*/
}
//Log.i(TAG, mStringBuffer.toString());
return scanResultsList;
}
else {
return null;
}
} /**
* 判断指定的网络是否能被扫描到
* @param wifi_SSID
* @return 如果能够在周边发现指定的网络就返回true,否则返回false
*/
public boolean canScannable(String wifi_SSID) {
boolean canScannable = false;
scan();//开始扫描周边网络
//得到扫描到的wifi列表
if (scanResultList != null) {
for (int i = 0; i < scanResultList.size(); i++) {
System.out.println("scanResultList " + i + "----->" + scanResultList.get(i).SSID);
if (scanResultList.get(i).SSID.equals(wifi_SSID)) {
canScannable = true;//如果想要链接的wifi能够扫描到,那么就说明能够链接
break;
}
}
}
return canScannable;
} /**
* 得到指定网络的index(从0开始计数),找不到就返回-1
*/
public int getTagWifiId(String netName){
// 开始扫描网络
scan();
scanResultList = mWifiManager.getScanResults();
if (scanResultList != null) {
for (int i = 0; i < scanResultList.size(); i++) {
mScanResult = scanResultList.get(i);
if(mScanResult.SSID.equals(netName)){
return i;
}
String show = "No = "+i +
" SSID = "+mScanResult.SSID +
" capabilities = "+mScanResult.capabilities +
" level = "+mScanResult.level;
Log.i(TAG, show);
}
}
return -1;
} /**
* 断开当前连接的网络
*/
public void disconnectWifi() {
int netId = getCurrentNetworkId();
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
mWifiInfo = null;
} /**
* 检查当前网络状态
* 如果有wifi链接,返回true,如果没有就返回false
*/
public boolean getWifiConnectState() {
return mWifiInfo != null ? true : false;
} /**
* @return 当前网络的名字,如果没有就返回null,否则返回string
*/
public String getCurrentSSID(){
return (mWifiInfo == null) ? null :mWifiInfo.getSSID();
} /**
* 得到连接的ID,如果没有就返回0,否则返回正确的id
*/
public int getCurrentNetworkId() {
return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
} /**
* 得到IP地址,出错时返回0
*/
public int getCurrentIPAddress() {
return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
} /**
* 得到MAC地址
* @return 出錯了返回null
*/
public String getCurrentMacAddress() {
return (mWifiInfo == null) ? null : mWifiInfo.getMacAddress();
} /**
* 得到接入点的BSSID
* @return 出錯返回null
*/
public String getCurrentBSSID() {
return (mWifiInfo == null) ? null : mWifiInfo.getBSSID();
} /**
* 得到WifiInfo的所有信息包
* @return 出错了返回null
*/
public WifiInfo getCurrentWifiInfo() {
return (mWifiInfo == null) ? null : mWifiInfo;
} // 锁定WifiLock
public void acquireWifiLock() {
mWifiLock.acquire();
} // 解锁WifiLock
public void releaseWifiLock() {
// 判断时候锁定
if (mWifiLock.isHeld()) {
mWifiLock.acquire();
}
} // 创建一个WifiLock
public void creatWifiLock() {
mWifiLock = mWifiManager.createWifiLock("Test");
} // 得到配置好的网络
public List<WifiConfiguration> getConfiguration() {
return mWifiConfigList;
} /**
* @param index
* @return 没有连接到返回false,正在连接则返回true
*/
public boolean connectConfiguratedWifi(String wifi_SSID) {
//如果当前网络不是想要链接的网络,要连接的网络是配置过的,并且要连接的网络能够被扫描到
if (getCurrentSSID().indexOf(wifi_SSID) == -1 ) {
if (getWifiConfigurated(wifi_SSID) != -1 && canScannable(wifi_SSID)) {
mWifiManager.enableNetwork(getWifiConfigurated(wifi_SSID), true);
}
else {
return false;
}
}
return true;
} /**
* 判断要连接的wifi名是否已经配置过了
* @return 返回要连接的wifi的ID,如果找不到就返回-1
*/
public int getWifiConfigurated(String wifi_SSID) {
int id = -1;
if (mWifiConfigList != null) {
for (int j = 0; j < mWifiConfigList.size(); j++) {
if (mWifiConfigList.get(j).SSID.equals("\"" + wifi_SSID + "\"")) {
//如果要连接的wifi在已经配置好的列表中,那就设置允许链接,并且得到id
id = mWifiConfigList.get(j).networkId;
break;
}
}
}
return id;
} }
源码下载:http://download.csdn.net/detail/shark0017/7962497
让手机连接到指定的WIFI网络,适用于之前已经连过的网络的更多相关文章
- Android自动连接指定的wifi,免密码或指定密码
一.运行时的状态 遇到一个这样的要求:“不进行扫描操作,怎么对指定的免密码WIFI进行连接(之前没有连接过)”,于是动手写了一个Demo,如图所示未连接成功时的状态,第一个编辑框让用户输入SSID,第 ...
- 转-Android中自动连接到指定SSID的Wi-Fi
最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...
- 手机连接wifi自动弹窗的原理及其实现方案
一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...
- 【转】Android中自动连接到指定SSID的Wi-Fi
最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...
- 手机连接WiFi有感叹号x怎么回事?如何消除手机WiFi感叹号?
经过多年的革新,现在的安卓系统已经非常优秀了,某些程度已经超越iOS,卡顿和耗电也不再是安卓系统的代名词了.而为了体验到最优秀的安卓系统,不少人都会购买海外的手机,因为海外手机的安卓系统都比较精简,非 ...
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有 ...
- 为什么手机连接wifi会显示已停用?
1.通常导致手机连接WiFi显示“已停用”故障的原因是由于无线路由器“安全模式”设置不当造成的,对此我们可以通过以下方法来解决: 2.根据无线路由器背面的信息(包括路由器IP地址,登陆用户名和密码), ...
- 在电脑上查看小米手机连接wifi时保存的密码
手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...
- 百度APP移动端网络深度优化实践分享(二):网络连接优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...
随机推荐
- 1195: [HNOI2006]最短母串
思路:好像以前谁问过我这题... 状个压就好啦, 把包含在其他串中的字符串删掉, 预处理除每两个字符串之间的关系, dp[ state ][ i ] 表示在state的状态下, 最后一个字符串是第i ...
- Linux性能优化之内存优化(二)
前言 不知道大家看完前面一章关于CPU优化,是否受到相应的启发呢?如果遇到任何问题,可以留言和一起探讨这方面的问题.接下来我们介绍一些关于内存方面的知识.内存管理软件包括虚拟内存系统.地址转换.交换. ...
- Python - 计算个人所得税
最近在学python,写了个计算个人所得税计算的脚本,分享. 以下为python3适用版本 #!/usr/bin/python # -*- coding: UTF-8 -*- # 该python脚本用 ...
- .NET 4.0 和 .NET 4.0 Client Profile 区别
Visual Studio 2010如期发布了,我怀着迫不及待的心情马上下载了最新的ISO来安装和感受一下. .NET Framework 自从 2002 年发展至今,已经历了好几个版本,1.0, 1 ...
- 【BZOJ 1180】 (LCT)
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1078 Solved: 662 Descript ...
- Google的开源C++单元测试框架Google Test
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
- java集合之vector容器
学完ArrayList和LinkedList之后,我们接着学习Vector.第1部分 Vector介绍第2部分 Vector数据结构第3部分 Vector源码解析(基于JDK1.6.0_45)第4部分 ...
- BZOJ3501 : PA2008 Cliquers Strike Back
\[\begin{eqnarray*}ans&=&m^{\sum_{i=1}^n Stirling2(n,i)\bmod 999999598}\bmod 999999599\\& ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- 0xWS2812 STM32 driver for WS2812(B) RGB LEDs
0xWS2812 STM32 driver for WS2812(B) RGB LEDs 0xWS2812 pronounced "hex-WS2812" This code ai ...