• Android扫码连接WIFI实现


    0,目标

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

    1,前提条件

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

    2,增加权限

            在AndroidManifest.xml中增加权限

    1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    3,参数检查

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

    1. //WIFI连接
    2. if (strResult.contains("P:") && strResult.contains("T:")) {// 自动连接wifi
    3. ConnectWifi(strResult);
    4. }
    4,WIFI连接调用
    1. private void ConnectWifi(String strResult)
    2. {
    3. //取连接参数
    4. String passwordTemp = strResult.substring(strResult
    5. .indexOf("P:"));
    6. password = passwordTemp.substring(2,
    7. passwordTemp.indexOf(";"));
    8. String netWorkTypeTemp = strResult.substring(strResult
    9. .indexOf("T:"));
    10. netWorkType = netWorkTypeTemp.substring(2,
    11. netWorkTypeTemp.indexOf(";"));
    12. String netWorkNameTemp = strResult.substring(strResult
    13. .indexOf("S:"));
    14. netWorkName = netWorkNameTemp.substring(2,
    15. netWorkNameTemp.indexOf(";"));
    16. WifiAdmin wifiAdmin = new WifiAdmin(MainActivity.this);
    17. if (!wifiAdmin.mWifiManager.isWifiEnabled()) {
    18. Toast.makeText(this, "开启wifi设置", Toast.LENGTH_LONG).show();
    19. wifiAdmin.openWifi();
    20. }
    21. int net_type = 0x13;
    22. if (netWorkType.compareToIgnoreCase("wpa") == 0) {
    23. net_type = WifiAdmin.TYPE_WPA;// wpa
    24. } else if (netWorkType.compareToIgnoreCase("wep") == 0) {
    25. net_type = WifiAdmin.TYPE_WEP;// wep
    26. } else {
    27. net_type = WifiAdmin.TYPE_NO_PASSWD;// 无加密
    28. }
    29. boolean bConnect = wifiAdmin.addNetwork(netWorkName,password,net_type);//连接
    30. if(bConnect)
    31. {
    32. Toast.makeText(this, "网络连接成功", Toast.LENGTH_LONG).show();
    33. }
    34. else
    35. {
    36. Toast.makeText(this, "网络连接失败", Toast.LENGTH_LONG).show();
    37. }
    38. }

    5,WIFI连接类

    1. import android.content.Context;
    2. import android.net.wifi.WifiConfiguration;
    3. import android.net.wifi.WifiInfo;
    4. import android.net.wifi.WifiManager;
    5. import android.util.Log;
    6. import java.util.List;
    7. /**
    8. * Created by cmos.
    9. */
    10. public class WifiAdmin {
    11. private static String TAG="WifiManger";
    12. public static final int TYPE_NO_PASSWD = 0x11;
    13. public static final int TYPE_WEP = 0x12;
    14. public static final int TYPE_WPA = 0x13;
    15. public WifiManager mWifiManager;
    16. private WifiInfo mWifiInfo;
    17. public WifiAdmin(Context context){
    18. mWifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    19. // mWifiInfo = mWifiManager.getConnectionInfo();
    20. }
    21. // 添加一个网络并连接
    22. public boolean addNetwork(WifiConfiguration wifi){
    23. int netId=mWifiManager.addNetwork(wifi);
    24. return mWifiManager.enableNetwork(netId,true);
    25. }
    26. public boolean addNetwork(String ssid, String passwd, int type) {
    27. if (ssid == null || passwd == null || ssid.equals("")) {
    28. Log.e(TAG, "addNetwork() ## nullpointer error!");
    29. return false ;
    30. }
    31. if (type != TYPE_NO_PASSWD && type != TYPE_WEP && type != TYPE_WPA) {
    32. Log.e(TAG, "addNetwork() ## unknown type = " + type);
    33. }
    34. return addNetwork(createWifiInfo(ssid, passwd, type));
    35. }
    36. public WifiConfiguration createWifiInfo(String SSID, String password, int type) {
    37. Log.e(TAG, "SSID = " + SSID + "## Password = " + password + "## Type = " + type);
    38. WifiConfiguration config = new WifiConfiguration();
    39. config.allowedAuthAlgorithms.clear();
    40. config.allowedGroupCiphers.clear();
    41. config.allowedKeyManagement.clear();
    42. config.allowedPairwiseCiphers.clear();
    43. config.allowedProtocols.clear();
    44. config.SSID = "\"" + SSID + "\"";
    45. WifiConfiguration tempConfig = this.IsExsits(SSID);
    46. if (tempConfig != null) {
    47. //如果已存在该SSID的wifi
    48. mWifiManager.removeNetwork(tempConfig.networkId);
    49. }
    50. // 分为三种情况:1没有密码2用wep加密3用wpa加密
    51. if (type == TYPE_NO_PASSWD) {// 没有密码
    52. config.wepKeys[0] = "";
    53. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    54. config.wepTxKeyIndex = 0;
    55. } else if (type == TYPE_WEP) { // wep加密
    56. config.hiddenSSID = true;
    57. config.wepKeys[0] = "\"" + password + "\"";
    58. config.allowedAuthAlgorithms
    59. .set(WifiConfiguration.AuthAlgorithm.SHARED);
    60. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    61. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    62. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    63. config.allowedGroupCiphers
    64. .set(WifiConfiguration.GroupCipher.WEP104);
    65. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    66. config.wepTxKeyIndex = 0;
    67. } else if (type == TYPE_WPA) { // WPA加密
    68. config.preSharedKey = "\"" + password + "\"";
    69. config.hiddenSSID = true;
    70. config.allowedAuthAlgorithms
    71. .set(WifiConfiguration.AuthAlgorithm.OPEN);
    72. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    73. config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    74. config.allowedPairwiseCiphers
    75. .set(WifiConfiguration.PairwiseCipher.TKIP);
    76. // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    77. config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    78. config.allowedPairwiseCiphers
    79. .set(WifiConfiguration.PairwiseCipher.CCMP);
    80. config.status = WifiConfiguration.Status.ENABLED;
    81. }
    82. return config;
    83. }
    84. //检测该SSID是否已存在
    85. private WifiConfiguration IsExsits(String SSID) {
    86. List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
    87. for (WifiConfiguration existingConfig : existingConfigs) {
    88. if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
    89. return existingConfig;
    90. }
    91. }
    92. return null;
    93. }
    94. // 打开WIFI
    95. public void openWifi() {
    96. if (!mWifiManager.isWifiEnabled()) {
    97. mWifiManager.setWifiEnabled(true);
    98. }
    99. }
    100. // 关闭WIFI
    101. public void closeWifi() {
    102. if (mWifiManager.isWifiEnabled()) {
    103. mWifiManager.setWifiEnabled(false);
    104. }
    105. }
    106. }

  • 相关阅读:
    KVM报错:Unable to connect to libvirt qemu:///system. 确定 ‘libvirtd’ 守护进程正在运行。
    Windows系统使用powershell查找并删除重复文件
    Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径
    Maven下载及环境搭建
    vscode插件Open in External App windows下使用typora打开md文件
    【内存拷贝函数:memcpy与memmove】
    java boot项目读取yml配置信息
    QT 排序操作
    获取随机维基页面的Python模块实现
    【Spring Boot】Spring Bootd的介绍、项目的创建
  • 原文地址:https://blog.csdn.net/lsh670660992/article/details/132732376