现在二维码的用处越来越多,微信扫二维码加好友,商场扫二维码关注公众号、得优惠券,就连一些小餐馆吃个饭,扫码自动跳转到线上(饿了么,百度外卖)的店铺.....而这些地方因为人多,担心用户等待时间过长就会走掉,怎么办?得有空调、wifi、西瓜,这样才能留住一部分客人,而wifi密码一般是直接问店里服务员获取,但是时间一长,人一多,店里老板和员工也烦了,干脆直接把wifi密码贴出来。但是这些都不够,我认为未来微信、QQ得加入(扩展)这个功能,扫描这个wifi二维码,询问用户是否连接上此wifi。
不说了,看源码吧,还是挺简单的。
原理是 基础的扫描二维码功能,识别二维码后,解析其内容,打开我们的wifi管理器,加入此wifi。
一般标准的wifi二维码的格式是这样的:
二维码扫描的部分就不说了,可以参考我前一篇的文章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