前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >代码实现WIFI自动连接与连接指定WIFI源码

代码实现WIFI自动连接与连接指定WIFI源码

作者头像
对话、
发布于 2022-02-22 05:55:17
发布于 2022-02-22 05:55:17
3.7K00
代码可运行
举报
文章被收录于专栏:Android-XjAndroid-Xj
运行总次数:0
代码可运行

最近家里老人总是问我如何连接WIFI,和他们电话讲又讲不清楚,于是我想到了写一个,打开自动连接指定WIFI的软件。练练手。

废话不多说,首先布局,简单!

两个文本框一个按钮

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Shezhi"
    android:orientation="vertical"
    android:background="#b2cbfd"
    android:focusable="true"
    android:focusableInTouchMode="true">
<EditText
    android:hint="请输入wifi名"
    android:layout_marginTop="10dp"
    android:id="@+id/mingzi"
    android:layout_width="match_parent"
    android:layout_height="50dp" />
    <EditText
        android:hint="请输入wifi密码"
        android:layout_marginTop="10dp"
        android:id="@+id/mima"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
    <Button
        android:textSize="20sp"
        android:text="确定"
        android:id="@+id/queding"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

设置连接WIFI名和密码 将用户输入的WIFI名和密码保存到sp中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Shezhi extends AppCompatActivity {
        private EditText mingzi;
        private EditText mima;
        private SharedPreferences sharedPreferences;
        private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shezhi);
        chushihua();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String trim = mingzi.getText().toString().trim();
                String trim1 = mima.getText().toString().trim();
                if (!trim.isEmpty() && !trim1.isEmpty()){
                    SharedPreferences.Editor edit = sharedPreferences.edit();
                    edit.putString("mingzi",trim);
                    edit.putString("mima",trim1);
                    edit.commit();
                    Toast.makeText(getApplicationContext(),"设置成功",Toast.LENGTH_SHORT).show();
                    finish();
                }else {
                    Toast.makeText(getApplicationContext(),"不能为空",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void chushihua() {
        mingzi=(EditText)findViewById(R.id.mingzi);
        mima=(EditText)findViewById(R.id.mima);
        button=(Button)findViewById(R.id.queding);
        sharedPreferences=getSharedPreferences("wifi",0);
    }
}

WIFI连接工具类 这是一个封装好的类(用于连接WIFI的一系列操作),具体里面注释了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Wifigongju {
    // 定义WifiManager对象
    private WifiManager mWifiManager;
    // 定义WifiInfo对象
    private WifiInfo mWifiInfo;
    // 扫描出的网络连接列表
    private List<ScanResult> mWifiList;
    // 网络连接列表
    private List<WifiConfiguration> mWifiConfiguration;
    // 定义一个WifiLock
    WifiManager.WifiLock mWifiLock;


    // 构造器
    public Wifigongju(Context context) {

        // 取得WifiManager对象
        mWifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);

        // 取得WifiInfo对象
        mWifiInfo = mWifiManager.getConnectionInfo();
    }

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

    }

    // 关闭WIFI
    public void closeWifi() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiManager.setWifiEnabled(false);
        }
    }

    // 检查当前WIFI状态
    public int checkState() {
        return mWifiManager.getWifiState();
    }

    // 锁定WifiLock
    public void acquireWifiLock() {
        mWifiLock.acquire();
    }

    // 解锁WifiLock
    public void releaseWifiLock() {
        // 判断时候锁定
        if (mWifiLock.isHeld()) {
            mWifiLock.acquire();
        }
    }

    // 创建一个WifiLock
    public void creatWifiLock() {
        mWifiLock = mWifiManager.createWifiLock("Test");
    }

    // 得到配置好的网络
    public List<WifiConfiguration> getConfiguration() {
        return mWifiConfiguration;

    }

    // 指定配置好的网络进行连接
    public void connectConfiguration(int index) {
        // 索引大于配置好的网络索引返回
        if (index > mWifiConfiguration.size()) {
            return;
        }
        // 连接配置好的指定ID的网络
        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
                true);
    }

    public void startScan() {
        mWifiManager.startScan();
        // 得到扫描结果
        mWifiList = mWifiManager.getScanResults();
        // 得到配置好的网络连接
        mWifiConfiguration = mWifiManager.getConfiguredNetworks();
    }

    // 得到网络列表
    public List<ScanResult> getWifiList() {
        return mWifiList;
    }

    // 查看扫描结果
    public StringBuilder lookUpScan() {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < mWifiList.size(); i++) {
            stringBuilder
                    .append("Index_" + new Integer(i + 1).toString() + ":");
            // 将ScanResult信息转换成一个字符串包
            // 其中把包括:BSSID、SSID、capabilities、frequency、level
            stringBuilder.append((mWifiList.get(i)).toString());
            stringBuilder.append("/n");
        }
        return stringBuilder;
    }

    // 得到MAC地址
    public String getMacAddress() {
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
    }

    // 得到接入点的BSSID
    public String getBSSID() {
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
    }

    // 得到IP地址
    public int getIPAddress() {
        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
    }

    // 得到连接的ID
    public int getNetworkId() {
        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
    }

    // 得到WifiInfo的所有信息包
    public String getWifiInfo() {
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
    }

    // 添加一个网络并连接
    public boolean addNetwork(WifiConfiguration wcg) {


        int wcgID = mWifiManager.addNetwork(wcg);
        boolean b =  mWifiManager.enableNetwork(wcgID, true);
        Log.e("连接状态", String.valueOf(b));
        return b;
    }

    // 断开指定ID的网络
    public void disconnectWifi(int netId) {
        mWifiManager.disableNetwork(netId);
        mWifiManager.disconnect();
    }


//然后是一个实际应用方法,只验证过没有密码的情况:

    public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type)
                
    {
//        while (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING){
//
//            try {
//                Thread.currentThread();
//                Thread.sleep(100);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }


        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)
    {
        while (mWifiManager.getConfiguredNetworks()==null){

            try {
                Thread.currentThread();
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
            for (WifiConfiguration existingConfig : existingConfigs) {
                if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
                    return existingConfig;
                }
            }

        return null;
    }
}

这个类是通用的只要连接WIFI就可以使用这个工具类

由于连接WIFI需要权限,所以我们需要授权

授权(z这是一个封装好的回调接口)动态授权

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BaseActivity extends AppCompatActivity {
    public interface PermissionListener {

        void onGranted();//已授权

        void onDenied(List<String> deniedPermission);//未授权

    }

    private PermissionListener mListener;
    private static final int PERMISSION_REQUESTCODE = 100;

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }

    public void requestRunPermisssion(String[] permissions, PermissionListener listener){
        mListener = listener;
        List<String> permissionLists = new ArrayList<>();
        for(String permission : permissions){
            if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                permissionLists.add(permission);
            }
        }

        if(!permissionLists.isEmpty()){
            ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
        }else{
            //表示全都授权了
            mListener.onGranted();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case PERMISSION_REQUESTCODE:
                if(grantResults.length > 0){
                    //存放没授权的权限
                    List<String> deniedPermissions = new ArrayList<>();
                    for(int i = 0; i < grantResults.length; i++){
                        int grantResult = grantResults[i];
                        String permission = permissions[i];
                        if(grantResult != PackageManager.PERMISSION_GRANTED){
                            deniedPermissions.add(permission);
                        }
                    }
                    if(deniedPermissions.isEmpty()){
                        //说明都授权了
                        mListener.onGranted();
                    }else{
                        mListener.onDenied(deniedPermissions);
                    }
                }
                break;
            default:
                break;
        }
    }
}

接下来我们只需要在Main中使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends BaseActivity {
    private Button button;
    private SharedPreferences sharedPreferences;
    private TextView shuju;
    private TextView jieguo;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chushihua();
        sharedPreferences = getSharedPreferences("wifi", 0);
        dongtaishouquan();


    }


    private void dongtaishouquan() {
        requestRunPermisssion(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() {
            @Override
            public void onGranted() {
                if (sharedPreferences.getString("mingzi", "sss").equals("sss") && sharedPreferences.getString("mima", "0").equals("0")) {
                    shuju.setText("失败原因没有设置wifi,请点击下方按钮设置要连接的wifi");
                } else {
                    Wifigongju wifigongju = new Wifigongju(getApplicationContext());
                    wifigongju.openWifi();

                    boolean b = wifigongju.addNetwork(wifigongju.CreateWifiInfo(sharedPreferences.getString("mingzi", "sss"), sharedPreferences.getString("mima", "0"), 3));
                    if (b) {
                        jieguo.setText("连接成功");
                        shuju.setText("已连接至" + wifigongju.getBSSID());
                    } else {
                        jieguo.setText("连接失败");
                    }
                }
            }
            @Override
            public void onDenied(List<String> deniedPermission) {

            }
        });

    }
        private void chushihua () {
            button = (Button) findViewById(R.id.shezhi);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(getApplicationContext(), Shezhi.class));
                }
            });
            shuju = (TextView) findViewById(R.id.shuju);
            jieguo = (TextView) findViewById(R.id.jieguo);
        }

    }

最后权限说明 (重要)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- //修改网络状态权限 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 修改wifi状态的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- //访问网络权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- //访问wifi权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 定位权限 -->

这些权限最好都加上,防止app炸!

学习永无止境!加油。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
⚠️ Python编写简易API
本文约550字,将耗费您约4⃣️分钟~ 所有的操作,仅在mac系统上实操过 前期准备 创建一个虚拟环境: $ mkdir flask_restful $ cd flask_restful $ python3 -m venv venv 激活虚拟环境: $ . venv/bin/activate 虚拟环境退出: $ deactivate 安装flask和flask_restful: $ pip install flask $ pip install flask_restful 项目接口模拟 在项目的根目录下
Jimmy_is_jimmy
2022/03/10
9410
Flask 学习-23.restful 接口开发
前言 Flask-RESTful 是一个 Flask 扩展,它添加了快速构建 REST APIs 的支持。它当然也是一个能够跟你现有的ORM/库协同工作的轻量级的扩展。 Flask-RESTful 鼓励以最小设置的最佳实践。如果你熟悉 Flask 的话,Flask-RESTful 应该很容易上手。 环境准备 使用 pip 安装 Flask-RESTful: pip install flask-restful 中文官方文档:http://www.pythondoc.com/Flask-RESTful/qui
上海-悠悠
2022/09/02
4340
Flask 学习-23.restful 接口开发
Flask-RESTful-API文档的生成和发布(一)
Flask-RESTful是一个基于Flask的扩展,它提供了一种快速构建RESTful API的方法。在开发RESTful API时,我们通常需要为API生成文档并进行发布,以便其他开发人员可以了解API的使用方法和参数,以便在开发过程中快速调试和集成。
堕落飞鸟
2023/05/06
1.1K0
Flask-RESTful扩展的安装和配置(一)
Flask-RESTful 是一个 Flask 扩展,可以方便地创建 RESTful APIs。它提供了方便的资源路由、请求和响应数据的序列化和反序列化、异常处理等功能,使得开发 RESTful APIs 变得简单易用。
堕落飞鸟
2023/05/06
4200
Python的Flask框架开发RESTful API
运行python app.py,Flask自带的Server在端口5000上监听:
测试开发社区
2019/09/20
1.5K0
Python的Flask框架开发RESTful API
Python总结-----Flask框架
django-admin 可以快速创建工程目录 manage.py 管理工程项目 orm 这是一个模型类,是一个抽象层的数据库,类似于iOS的Model、安卓的实体类和Java的Dto admin 后台管理站
GuangdongQi
2020/05/26
6800
认识Flask框架
Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理。但是缺点也很明显,它偏重。就像是一个装潢好的房子,它提供好了你要用的东西,直接拿来用就可以。
Devops海洋的渔夫
2019/10/24
9380
认识Flask框架
Flask RESTful API 简单的设计一个 GET 请求接口
数据库:PostgreSQL 框架:Flask 语言:Python 3.6 前提 之前我有每天定时爬取bing壁纸,写入postgresql数据库的,如下: ER图 需要的Python环境 flask
禹都一只猫olei
2018/07/05
6.2K3
python实现RESTful服务(基于flask)
上一篇文章讲到如何用java实现RESTful服务,这就来讲讲怎么用python来实现吧,因为要搭建一套java和python互调的服务,两者都不能少啊。
vell001
2018/08/09
2.8K0
python实现RESTful服务(基于flask)
Python Flask高级用法:构建强大而可扩展的Web应用
Flask是一款简单而灵活的Web框架,但其灵活性同时也为开发者提供了许多高级用法和扩展,使得可以构建强大而可扩展的Web应用。本文将深入介绍一些Flask的高级用法,包括Blueprints、Middleware、信号处理以及一些优化和安全性的实践。
dbdocker
2024/02/05
3850
Flask API 项目 Swagger 版本打架不兼容
通过使用 Flask-RESTful 和 flask-apispec 来定义 API 资源,并添加 Swagger 文档注解。
误入歧途
2025/04/22
670
Flask API 项目 Swagger 版本打架不兼容
Web 开发 RESTful
Flask 的 RESTful 模块是 flask-restful ,使用 pip 安装:
HLee
2021/04/08
1.1K0
Web 开发 RESTful
Flask-RESTful的资源和路由设计
在 Flask-RESTful 中,资源是应用程序的主要组成部分,用于处理客户端请求和响应。资源类可以通过 HTTP 方法进行操作,例如 GET、POST、PUT、DELETE 等。
堕落飞鸟
2023/05/06
4900
flask框架基本使用
Flask可以搭建轻量服务api,而且使用python语言编写程序,非常方便。以前也使用过php做服务器后端,但是不喜欢php的$,而且我想多学学python,没想到Flask框架恰好能满足我的需求,简直是一个神器!特别适合我这种非计算机专业人士学习,能快速搭建api,为前端web、微信小程序等提供api服务,非常nice,爱了爱了
Crayon鑫
2023/10/10
5370
从 Flask 切到 FastAPI 后,起飞了!
本文翻译自 Moving from Flask to FastAPI, 作者:Amal Shaji
Python编程与实战
2024/03/04
1.6K0
从 Flask 切到 FastAPI 后,起飞了!
Flask-RESTful的请求和响应处理(一)
在 Flask-RESTful 应用程序中,请求和响应处理非常简单。我们可以使用 Flask-RESTful 的 reqparse 模块来解析请求参数,并使用 Flask-RESTful 的 marshal 模块来序列化响应数据。
堕落飞鸟
2023/05/06
8340
Flask 扩展系列之 Flask-R
Flask-RESTful是一个Flask的扩展,它增加了对快速构建REST APIs的支持。它是一种轻量级的抽象,可以与现有的ORM/库一起工作。Flask-RESTful励以最少的安装方式进行最佳实践。如果你对Flask很熟悉的,Flask-RESTful会很容易上手。
py3study
2020/01/03
1.1K0
教你 10 分钟构建一套 RESTful API 服务( 中 )
上一篇文章,介绍了使用 Java + Spring Boot + MyBatis 构建 RESTful API 的详细步骤;很多小伙伴表示,更愿意用 Python 编写 RESTful API 服务,希望我能写一下
AirPython
2020/06/15
1.7K2
使用Flask构建简单的Web应用
在当今数字时代,构建高效、可扩展的Web应用程序是开发者们的一项重要任务。Python,作为一种简洁、强大的编程语言,为Web开发提供了丰富的工具和框架。在本篇文章中,我们将探讨使用Python构建Web应用程序的最佳实践,通过代码实例和深度解析来帮助你更好地理解和运用这些技术。
一键难忘
2024/04/17
5680
34. Flask 集成 flask-restful
这种方式当然可以开发 api, 但是当我们想要基于 restful 风格来编写 api,就不太方便了。就需要写 4 个单独的函数视图,如下:
Devops海洋的渔夫
2022/01/14
9000
34. Flask 集成 flask-restful
相关推荐
⚠️ Python编写简易API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验