Android扫描wifi二维码自动连接wifi

本文介绍如何在Android设备上实现扫描WiFi二维码并自动连接的功能。通过解析二维码内容,调用WiFi管理器来添加和连接WiFi。但在Android 6.0及以上版本存在限制,仅允许操作自己创建的WiFi配置。文中提供了适配6.0以上系统的代码示例。
摘要由CSDN通过智能技术生成

现在二维码的用处越来越多,微信扫二维码加好友,商场扫二维码关注公众号、得优惠券,就连一些小餐馆吃个饭,扫码自动跳转到线上(饿了么,百度外卖)的店铺.....而这些地方因为人多,担心用户等待时间过长就会走掉,怎么办?得有空调、wifi、西瓜,这样才能留住一部分客人,而wifi密码一般是直接问店里服务员获取,但是时间一长,人一多,店里老板和员工也烦了,干脆直接把wifi密码贴出来。但是这些都不够,我认为未来微信、QQ得加入(扩展)这个功能,扫描这个wifi二维码,询问用户是否连接上此wifi。

不说了,看源码吧,还是挺简单的。

原理是 基础的扫描二维码功能,识别二维码后,解析其内容,打开我们的wifi管理器,加入此wifi。

一般标准的wifi二维码的格式是这样的:

 WIFI:S:arg1;P:arg2;T:arg3; 
其中 arg1是wifi名(也就是SSID);arg2是密码,当然也可以为空,就是没有密码;arg3是网络的加密类型,一般有3种,无密码、Wpa/wap2、Wep。

二维码扫描的部分就不说了,可以参考我前一篇的文章Android二维码识别与生成,或者嫌前一篇麻烦的,后面我会给出此Demo的源码。

当我们扫描到二维码后,会在handleDecode中去处理扫描结果,处理完毕后会通过setResult方式,将Intent和结果传回MainActivty的onActivityResult中,然后通过requestCode和resultCode去判断来自于哪个activity的Intent,接着取出值。

其解析处理结果

 switch (requestCode) {
		case SCANNIN_GREQUEST_CODE:
			if(resultCode == RESULT_OK){
				Bundle bundle = data.getExtras();
				//显示扫描到的内容
				mTextView.setText(bundle.getString("result"));
				//显示
				//mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));
			
				String strResult = bundle.getString("result");
				if (strResult.contains("P:") && strResult.contains("T:")) {// 自动连接wifi
					Log.e("扫描返回的结果----->", strResult);// 还是要判断
					String passwordTemp = strResult.substring(strResult
							.indexOf("P:"));
					password = passwordTemp.substring(2,
							passwordTemp.indexOf(";"));
					String netWorkTypeTemp = strResult.substring(strResult
							.indexOf("T:"));
					netWorkType = netWorkTypeTemp.substring(2,
							netWorkTypeTemp.indexOf(";"));
					String netWorkNameTemp = strResult.substring(strResult
							.indexOf("S:"));
					netWorkName = netWorkNameTemp.substring(2,
							netWorkNameTemp.indexOf(";"));

					if (!wifiAdmin.mWifiManager.isWifiEnabled()) {
						Toast.makeText(this, "开启wifi设置", Toast.LENGTH_LONG)
								.show();
						wifiAdmin.openWifi();
					}
					Dialog alertDialog = new AlertDialog.Builder(this)
							.setTitle("扫描到可用wifi")
							.setIcon(R.drawable.ic_launcher)
							.setMessage("wifi名:" + netWorkName)
							.setNegativeButton("取消",
									new DialogInterface.OnClickListener() {

										@Override
										public void onClick(
												DialogInterface dialog,
												int which) {
											// TODO Auto-generated method stub
										}
									})
							.setPositiveButton("加入此wifi ",
									new DialogInterface.OnClickListener() {
										@Override
										public void onClick(
												DialogInterface dialog,
												int which) {
											int net_type = 0x13;
											if (netWorkType
													.compareToIgnoreCase("wpa") == 0) {
												net_type = WifiAdmin.TYPE_WPA;// wpa
											} else if (netWorkType
													.compareToIgnoreCase("wep") == 0) {
												net_type = WifiAdmin.TYPE_WEP;// wep
											} else {
												net_type = WifiAdmin.TYPE_NO_PASSWD;// 无加密
											}
											wifiAdmin.addNetwork(netWorkName,
													password,
													net_type);
											Log.e("解析的数据----->",
													"networkname: "
															+ netWorkName + " "
															+ "password: "
															+ password
															+ " netWorkType: "
															+ net_type);
										}
									}).create();
					alertDialog.show();
			
			}
			break;
		}
    }	

WifiAdmin.java的代码如下

import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;

import java.util.List;

/**
 * Created by cmos.
 */
public  class WifiAdmin {
	private static String TAG="WifiManger";
    public static final int TYPE_NO_PASSWD = 0x11;
    public static final int TYPE_WEP
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值