Android扫码连接WIFI实现

0,目标

APP中实现扫WIFI分享码自动连接WIFI功能

1,前提条件

设备需要有个扫码器(摄像头拍照识别也行),APP调用扫码器读取WIFI连接分享码。

2,增加权限

在AndroidManifest.xml中增加权限

复制代码
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3,参数检查

扫码成功后,对内容进行一个基本的判断,确认扫码数据中有P和T的参数

复制代码
//WIFI连接
if (strResult.contains("P:") && strResult.contains("T:")) {// 自动连接wifi
   ConnectWifi(strResult);
}
4,WIFI连接调用
复制代码
    private void ConnectWifi(String 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(";"));

        WifiAdmin wifiAdmin = new WifiAdmin(MainActivity.this);
        if (!wifiAdmin.mWifiManager.isWifiEnabled()) {
            Toast.makeText(this, "开启wifi设置", Toast.LENGTH_LONG).show();
            wifiAdmin.openWifi();
        }

        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;// 无加密
        }

        boolean bConnect =  wifiAdmin.addNetwork(netWorkName,password,net_type);//连接
        if(bConnect)
        {
           Toast.makeText(this, "网络连接成功", Toast.LENGTH_LONG).show();
        }
        else
        {
            Toast.makeText(this, "网络连接失败", Toast.LENGTH_LONG).show();
        }

    }

5,WIFI连接类

复制代码
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 = 0x12;
    public static final int TYPE_WPA = 0x13;
    public WifiManager mWifiManager;
    private WifiInfo mWifiInfo;
    public WifiAdmin(Context context){
        mWifiManager=  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        // mWifiInfo = mWifiManager.getConnectionInfo();
    }

    // 添加一个网络并连接
    public boolean addNetwork(WifiConfiguration wifi){
        int netId=mWifiManager.addNetwork(wifi);
        return mWifiManager.enableNetwork(netId,true);
    }
    public boolean addNetwork(String ssid, String passwd, int type) {
        if (ssid == null || passwd == null || ssid.equals("")) {
            Log.e(TAG, "addNetwork() ## nullpointer error!");
            return false ;
        }

        if (type != TYPE_NO_PASSWD && type != TYPE_WEP && type != TYPE_WPA) {
            Log.e(TAG, "addNetwork() ## unknown type = " + type);
        }

        return addNetwork(createWifiInfo(ssid, passwd, type));
    }

    public WifiConfiguration createWifiInfo(String SSID, String password, int type) {

        Log.e(TAG, "SSID = " + SSID + "## Password = " + password + "## Type = " + 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) {
            //如果已存在该SSID的wifi
            mWifiManager.removeNetwork(tempConfig.networkId);
        }

        // 分为三种情况:1没有密码2用wep加密3用wpa加密
        if (type == TYPE_NO_PASSWD) {// 没有密码
            config.wepKeys[0] = "";
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.wepTxKeyIndex = 0;

        } else if (type == TYPE_WEP) {  //  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;
        } else if (type == TYPE_WPA) {   // 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;
    }

    //检测该SSID是否已存在
    private WifiConfiguration IsExsits(String SSID) {
        List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
        for (WifiConfiguration existingConfig : existingConfigs) {
            if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
                return existingConfig;
            }
        }
        return null;
    }

    // 打开WIFI
    public void openWifi() {
        if (!mWifiManager.isWifiEnabled()) {
            mWifiManager.setWifiEnabled(true);
        }
    }

    // 关闭WIFI
    public void closeWifi() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiManager.setWifiEnabled(false);
        }
    }
}
相关推荐
合作小小程序员小小店12 分钟前
web网页开发,在线%考试管理%系统,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
java·前端·系统架构·vue·intellij-idea·springboot
天天进步20151 小时前
CSS Grid与Flexbox:2025年响应式布局终极指南
前端·css
Boop_wu1 小时前
[Java EE] 计算机基础
java·服务器·前端
江上清风山间明月2 小时前
Android 系统超级实用的分析调试命令
android·内存·调试·dumpsys
Novlan12 小时前
TDesign UniApp 组件库来了
前端
用户47949283569152 小时前
React DevTools 组件名乱码?揭秘从开发到生产的代码变形记
前端·react.js
百锦再2 小时前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
顾安r3 小时前
11.8 脚本网页 打砖块max
服务器·前端·html·css3
倚栏听风雨3 小时前
typescript 方法前面加* 是什么意思
前端
狮子不白3 小时前
C#WEB 防重复提交控制
开发语言·前端·程序人生·c#