Android编程实现wifi扫描及连接的方法
作者:迟做总比不做强 发布时间:2022-11-21 21:11:36
标签:Android,wifi
本文实例讲述了Android编程实现wifi扫描及连接的方法。分享给大家供大家参考,具体如下:
主界面,搜索附近WIFI信息
/**
* Search WIFI and show in ListView
*
*/
public class MainActivity extends Activity implements OnClickListener,
OnItemClickListener {
private Button search_btn;
private ListView wifi_lv;
private WifiUtils mUtils;
private List<String> result;
private ProgressDialog progressdlg = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUtils = new WifiUtils(this);
findViews();
setLiteners();
}
private void findViews() {
this.search_btn = (Button) findViewById(R.id.search_btn);
this.wifi_lv = (ListView) findViewById(R.id.wifi_lv);
}
private void setLiteners() {
search_btn.setOnClickListener(this);
wifi_lv.setOnItemClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.search_btn) {
showDialog();
new MyAsyncTask().execute();
}
}
/**
* init dialog and show
*/
private void showDialog() {
progressdlg = new ProgressDialog(this);
progressdlg.setCanceledOnTouchOutside(false);
progressdlg.setCancelable(false);
progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressdlg.setMessage(getString(R.string.wait_moment));
progressdlg.show();
}
/**
* dismiss dialog
*/
private void progressDismiss() {
if (progressdlg != null) {
progressdlg.dismiss();
}
}
class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
//扫描附近WIFI信息
result = mUtils.getScanWifiResult();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
progressDismiss();
initListViewData();
}
}
private void initListViewData() {
if (null != result && result.size() > 0) {
wifi_lv.setAdapter(new ArrayAdapter<String>(
getApplicationContext(), R.layout.wifi_list_item,
R.id.ssid, result));
} else {
wifi_lv.setEmptyView(findViewById(R.layout.list_empty));
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
TextView tv = (TextView) arg1.findViewById(R.id.ssid);
if (!TextUtils.isEmpty(tv.getText().toString())) {
Intent in = new Intent(MainActivity.this, WifiConnectActivity.class);
in.putExtra("ssid", tv.getText().toString());
startActivity(in);
}
}
}
/**
* 连接指定的WIFI
*
*/
public class WifiConnectActivity extends Activity implements OnClickListener {
private Button connect_btn;
private TextView wifi_ssid_tv;
private EditText wifi_pwd_tv;
private WifiUtils mUtils;
// wifi之ssid
private String ssid;
private String pwd;
private ProgressDialog progressdlg = null;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
showToast("WIFI连接成功");
finish();
break;
case 1:
showToast("WIFI连接失败");
break;
}
progressDismiss();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connect);
mUtils = new WifiUtils(this);
findViews();
setLiteners();
initDatas();
}
/**
* init dialog
*/
private void progressDialog() {
progressdlg = new ProgressDialog(this);
progressdlg.setCanceledOnTouchOutside(false);
progressdlg.setCancelable(false);
progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressdlg.setMessage(getString(R.string.wait_moment));
progressdlg.show();
}
/**
* dissmiss dialog
*/
private void progressDismiss() {
if (progressdlg != null) {
progressdlg.dismiss();
}
}
private void initDatas() {
ssid = getIntent().getStringExtra("ssid");
if (!TextUtils.isEmpty(ssid)) {
ssid = ssid.replace("\"", "");
}
this.wifi_ssid_tv.setText(ssid);
}
private void findViews() {
this.connect_btn = (Button) findViewById(R.id.connect_btn);
this.wifi_ssid_tv = (TextView) findViewById(R.id.wifi_ssid_tv);
this.wifi_pwd_tv = (EditText) findViewById(R.id.wifi_pwd_tv);
}
private void setLiteners() {
connect_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.connect_btn) {// 下一步操作
pwd = wifi_pwd_tv.getText().toString();
// 判断密码输入情况
if (TextUtils.isEmpty(pwd)) {
Toast.makeText(this, "请输入wifi密码", Toast.LENGTH_SHORT).show();
return;
}
progressDialog();
// 在子线程中处理各种业务
dealWithConnect(ssid, pwd);
}
}
private void dealWithConnect(final String ssid, final String pwd) {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
// 检验密码输入是否正确
boolean pwdSucess = mUtils.connectWifiTest(ssid, pwd);
try {
Thread.sleep(4000);
} catch (Exception e) {
e.printStackTrace();
}
if (pwdSucess) {
mHandler.sendEmptyMessage(0);
} else {
mHandler.sendEmptyMessage(1);
}
}
}).start();
}
private void showToast(String str) {
Toast.makeText(WifiConnectActivity.this, str, Toast.LENGTH_SHORT).show();
}
}
工具类:
public class WifiUtils {
// 上下文Context对象
private Context mContext;
// WifiManager对象
private WifiManager mWifiManager;
public WifiUtils(Context mContext) {
this.mContext = mContext;
mWifiManager = (WifiManager) mContext
.getSystemService(Context.WIFI_SERVICE);
}
/**
* 判断手机是否连接在Wifi上
*/
public boolean isConnectWifi() {
// 获取ConnectivityManager对象
ConnectivityManager conMgr = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
// 获取NetworkInfo对象
NetworkInfo info = conMgr.getActiveNetworkInfo();
// 获取连接的方式为wifi
State wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
.getState();
if (info != null && info.isAvailable() && wifi == State.CONNECTED)
{
return true;
} else {
return false;
}
}
/**
* 获取当前手机所连接的wifi信息
*/
public WifiInfo getCurrentWifiInfo() {
return mWifiManager.getConnectionInfo();
}
/**
* 添加一个网络并连接 传入参数:WIFI发生配置类WifiConfiguration
*/
public boolean addNetwork(WifiConfiguration wcg) {
int wcgID = mWifiManager.addNetwork(wcg);
return mWifiManager.enableNetwork(wcgID, true);
}
/**
* 搜索附近的热点信息,并返回所有热点为信息的SSID集合数据
*/
public List<String> getScanWifiResult() {
// 扫描的热点数据
List<ScanResult> resultList;
// 开始扫描热点
mWifiManager.startScan();
resultList = mWifiManager.getScanResults();
ArrayList<String> ssids = new ArrayList<String>();
if (resultList != null) {
for (ScanResult scan : resultList) {
ssids.add(scan.SSID);// 遍历数据,取得ssid数据集
}
}
return ssids;
}
/**
* 连接wifi 参数:wifi的ssid及wifi的密码
*/
public boolean connectWifiTest(final String ssid, final String pwd) {
boolean isSuccess = false;
boolean flag = false;
mWifiManager.disconnect();
boolean addSucess = addNetwork(CreateWifiInfo(ssid, pwd, 3));
if (addSucess) {
while (!flag && !isSuccess) {
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
String currSSID = getCurrentWifiInfo().getSSID();
if (currSSID != null)
currSSID = currSSID.replace("\"", "");
int currIp = getCurrentWifiInfo().getIpAddress();
if (currSSID != null && currSSID.equals(ssid) && currIp != 0) {
isSuccess = true;
} else {
flag = true;
}
}
}
return isSuccess;
}
/**
* 创建WifiConfiguration对象 分为三种情况:1没有密码;2用wep加密;3用wpa加密
*
* @param SSID
* @param Password
* @param Type
* @return
*/
public WifiConfiguration CreateWifiInfo(String SSID, String Password,
int Type) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";
WifiConfiguration tempConfig = this.IsExsits(SSID);
if (tempConfig != null) {
mWifiManager.removeNetwork(tempConfig.networkId);
}
if (Type == 1) // WIFICIPHER_NOPASS
{
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == 2) // WIFICIPHER_WEP
{
config.hiddenSSID = true;
config.wepKeys[0] = "\"" + Password + "\"";
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (Type == 3) // WIFICIPHER_WPA
{
config.preSharedKey = "\"" + Password + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
private WifiConfiguration IsExsits(String SSID) {
List<WifiConfiguration> existingConfigs = mWifiManager
.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
return existingConfig;
}
}
return null;
}
}
—–相关布局文件————–
主页面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/search_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="搜索附近WIFI"
android:textSize="16sp" >
</Button>
<ListView
android:id="@+id/wifi_lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/search_btn"
android:layout_marginTop="10dp"
android:divider="#d1d1d1"
android:dividerHeight="1px"
android:scrollbars="none" >
</ListView>
</RelativeLayout>
连接页面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/wifi_ssid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:padding="10dp"
android:text="@string/wifi_ssid"
android:textSize="16sp" />
<TextView
android:id="@+id/wifi_ssid_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_toRightOf="@id/wifi_ssid"
android:padding="10dp"
android:textSize="16sp" />
<TextView
android:id="@+id/wifi_pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/wifi_ssid"
android:layout_marginTop="15dp"
android:padding="10dp"
android:text="@string/wifi_pwd"
android:textSize="16sp" />
<EditText
android:id="@+id/wifi_pwd_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/wifi_ssid_tv"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:layout_toRightOf="@id/wifi_pwd"
android:hint="@string/input_pwd_hint"
android:padding="10dp"
android:textSize="16sp" />
<Button
android:id="@+id/connect_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="10dp"
android:text="连接WIFI"
android:textSize="16sp" >
</Button>
</RelativeLayout>
主页面ListView的item
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FFFFFF" >
<TextView
android:id="@+id/ssid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:paddingLeft="15dp"
android:textColor="#333333"
android:textSize="16sp" />
</RelativeLayout>
主界面未搜索 到WIFI的展示
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF" >
<TextView
android:id="@+id/ssid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="附近暂时没有WIFI"
android:textColor="#333333"
android:textSize="16sp" />
</RelativeLayout>
github上DEMO下载地址:https://github.com/ldm520/WIFI_TOOL
希望本文所述对大家Android程序设计有所帮助。
来源:http://blog.csdn.net/true100/article/details/50915993


猜你喜欢
- 本文实例为大家分享了Android简单实现天气预报App的具体代码,供大家参考,具体内容如下一、UI设计首页UI<?xml versi
- 1.指针指针就是地址(即一个数据)。2.指针变量2.1概念(1)指针变量是变量,是变量在内存中就会开辟空间,会有自己对应的的地址,有自己的变
- 这里介绍通过委托取消Button事件switch-case的方法。需要注意的是,事先要按顺序在各个Button的Tag属性中设置0、1、2、
- SharedPreferences在开发过程中,数据存取是较为频繁的,今天我们来了解下android几种常见的数据存取方式。在Android
- 今天,写了个小代码。抓取首页中的极客头条。效果如图:分享给新手朋友。要点:1.使用ApacheHttpClient库实现GET请求。2.异步
- 音乐播放需要调用service,在此,只是简单梳理播放流程。public class PlayMusicService extends Se
- 本文实例为大家分享了Android实现时钟特效的具体代码,供大家参考,具体内容如下效果展示:功能介绍:如果您想换一张背景图,可以点击左下角按
- Java 官网对Looper对象的说明:public class Looperextends ObjectClass used to run
- 使用Collections.sort对中文进行排序使用collections.sort(List list, Comparator <
- 简介LinkedBlockingQueue是一个阻塞的有界队列,底层是通过一个个的Node节点形成的链表实现的,链表队列中的头节点是一个空的
- C# 从枚举值获取对应的文本描述详解有时枚举值在显示时,需要显示枚举值对应的文本串。一种方案是在调用的地方使用switch或者if来判断枚举
- 在SpringMVC中 我们说到了 * , 它会在映射处理器(HandleMapping)执行时检查我们访问的地址是否配置拦截
- 使用fileupload组件的原因: Request对象提供了一个getInputStream()方法,通过这个方法可以读取到客户端提交过来
- 只要是面向对象的编程语言,基本上都有类Class的用法,只是好不好用,好不好记而已,面向对象是c++开始引入的,但是c++ 关于类的东西,弄
- java 线程池详解什么是线程池?提供一组线程资源用来复用线程资源的一个池子为什么要用线程池?线程的资源是有限的,当处理一组业务的时候,我们
- 一、什么是JMSJMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(M
- 判断一个数是不是回文数示例,回文数就是原数与其倒置后的数相等,如:123321,到之后仍为123321,即为回文数题目:一个5位数,判断它是
- 需求:学生输入姓名和语文、数学、英语,编程求出总分和平均分,并在屏幕上显示XX的总分和平均分using System;using Syste
- Android onClick 与 setOnClickListener区别为Android Widgets添加点击事件处理函数又
- 本文章主要讲二维数组定义,用法。1.什么是二维数组在二维数组多个元素为一维数组的数组就称为二维数组2.定义格式格式一:元素的数据类型[][]