Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android自动连接指定的wifi,免密码或指定密码
遇到一个这样的要求:“不进行扫描操作,怎么对指定的免密码WIFI进行连接(之前没有连接过)”,于是动手写了一个Demo,如图所示未连接成功时的状态,第一个编辑框让用户输入SSID,第二个编辑框输入密码,密码可以根据实例情况输入,也可以不输入密码,因为有些Wifi免密码。这里的免密码不是指可以破解wifi密码。注意图片中手机顶部的wifi图标,是没有的,说明此时并没有打开手机的wifi。在手机上运行状态如下所示:
张果
2022/05/09
2.3K0
Android自动连接指定的wifi,免密码或指定密码
Android检测网络是否可用并打开、扫描、连接WIFI
需求:要求先检查网络是否可用,如果可用就跳过网络设置界面,如果不可用就打开WIFI并扫描网络后去手动输入密码连接
程序员飞飞
2020/02/27
2.9K0
WIFI 简单的连接及常用密码破解
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129092.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
1.7K0
Android开发笔记(六十)网络的检测与连接
APP在访问网络之前,正常都要先检测网络状态,因为如果未连接网络就上网的话,常常导致超时等待。另外,APP有时也需区分当前网络是wifi环境还是数据连接环境,如果是数据连接环境,那么为了节省流量,一般不进行下载操作也不加载大图片;如果是wifi环境,那就都可以做而不必担心消耗流量。 ConnectivityManager就是用于检测网络连接的工具类,其对象从系统服务Context.CONNECTIVITY_SERVICE中获取。该类的常用方法是getActiveNetworkInfo,调用该方法返回一个NetworkInfo对象,下面是NetworkInfo的常用方法: getType : 获取网络类型。ConnectivityManager.TYPE_WIFI表示wifi,ConnectivityManager.TYPE_MOBILE表示数据连接,ConnectivityManager.TYPE_WIMAX表示wimax,ConnectivityManager.TYPE_ETHERNET表示以太网,ConnectivityManager.TYPE_BLUETOOTH表示蓝牙。 getState : 获取网络状态。State.CONNECTING表示正在连接,State.CONNECTED表示已连接,State.SUSPENDED表示挂起,State.DISCONNECTING表示正在断开,State.DISCONNECTED表示已断开,State.UNKNOWN表示未知。 getSubtype : 获取网络子类型。当网络类型为数据连接时,子类型为2G/3G/4G的细分类型,如CDMA、EVDO、HSDPA、LTE等等。 当网络类型是wifi时,要想获取详细的wifi信息,又得使用WifiManager,该类的对象从系统服务Context.WIFI_SERVICE中获取。下面是WifiManager的常用网络检测方法: isWifiEnabled : 判断WLAN功能是否开启 setWifiEnabled : 开关WLAN功能 getWifiState : 获取当前wifi的状态。WIFI_STATE_DISABLED表示已断开,WIFI_STATE_DISABLING表示正在断开,WIFI_STATE_ENABLED表示已连上,WIFI_STATE_ENABLING表示正在连接,WIFI_STATE_UNKNOWN表示未知。 getConnectionInfo : 获取当前wifi的连接信息。该方法返回一个WifiInfo对象,WifiInfo可通过相应的get方法获取如下信息:wifi名称、路由器MAC、WIFI信号强度、连接速率、IP地址、MAC地址、网络编号等等。
aqi00
2019/01/18
4.1K0
Android开发中Wi-Fi处理
wps(wifi protected setup):是为了进一步增强wpa热点及简化连接过程的技术,不属于加密类型。
码客说
2019/10/22
4.3K0
Android4.4.2源码分析之WiFi模块(三)
除了第二种情况无需密码的WiFi点击时直接连接,其他三种情况的点击事件的处理均是弹出dialog,只不过是根据不同情况去加载布局,说一下源码的实现思路,如果想做出这种效果可以增加代码的复用性可以参考源码实现思路。
fanfan
2022/05/07
9520
Android4.4.2源码分析之WiFi模块(三)
Android WIFI使用简述
  随着Android版本的更新,目前最新的版本是Android 13,并且已经有部分国产手机更新了此版本,对于Android开发者来说,变化其实不那么大,而对于本文章来说就有一些变化。
晨曦_LLW
2023/02/26
3.3K0
Android WIFI使用简述
Android11 WiFi连接流程梳理
一、可以看到点击连接以后,如果config不为null,则先保存网络,再进行连接,所以即使连接失败,此网络依然在已保存网络列表里。 packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java
用户7557625
2021/09/14
3.9K0
Android11 WiFi连接流程梳理
[Android][Framework]设置默认WiFi配置
点击Wifi热点配置选项,会弹出一个对话框,WifiApDialog.java。这个对话框会在onCreate的时候填入一些默认内容:
wOw
2020/01/20
2.7K0
Android4.4.2源码分析之WiFi模块(二)
查看WiFiManager发现各action定义如下,以及在监听到对应广播后各处理如下
fanfan
2022/05/07
1.3K0
Android4.4.2源码分析之WiFi模块(二)
LocalOnlyHotspot学习总结
前言:最近项目用到了LocalOnlyHotspot,做Wifi半年了也是第一次接触,在这里把最近俩周的学习内容做个总结。
用户7557625
2020/07/15
1.6K1
WiFiAp探究实录--功能实现与源码分析
Android虐我千百遍,我待Android如初恋。 ——————编辑于2017-08-02——————— wifi热点说的是wifiAp相关,所以如果源码开发的话,这个WifiAp算是一个搜索代码的关键字,含义是Wifi Access point,wifi接入点。所以下文中的wifi热点统一用WifiAp代替 wifiAp打开方式:设置->更多->移动网络共享->便携式wlan热点。 wifiAp打开条件:任何情况下均可。只是有内网外网之分。造成内外网之分的影响条件有sim卡和wifi
fanfan
2018/01/24
4.3K0
Android的Wifi连接
最近在做Wifi连接的功能,在网上查找了很多资料,可用的也比较少,最后遇到很多了问题,一路走来也解决了很多问题,特此记录。
None_Ling
2019/10/29
2.7K0
Android9.0Wifi热点开启流程梳理
Android9.0中对热点做了较大改动,将热点很大程度从Wifi中剥离出来了。 下面我们看一下热点是怎么开启的。
用户7557625
2020/07/15
4.6K0
Android4.4.2源码分析之WiFi模块(一)
由对Androidsetting的源码分析之WiFi模块的界面fragment为WiFisettings.java,关于setting模块的源码分析可以参考
fanfan
2022/05/07
9500
Android4.4.2源码分析之WiFi模块(一)
Android8.1的WIFI扫描后连接过程和配置IP地址
frameworks/base/wifi/java/android/net/wifi/WifiManager.java 在service中开启扫描。
用户7557625
2020/07/15
1.6K0
android 十八 蓝牙及Wi-Fi
蓝牙是一种重要的短距离无线通信技术,它被广泛应用于各种设备,比如计算机、手机、汽车等,支持设备之间的近距离通信,从而是数据传输更加快捷有效。Wi-Fi是一种高速的无线通信协议,它具有传输速度高,传输距离长的特点。通过WiFi,手机、PDA、电脑等移动设备可以以无线方式连接网络。本节中我们主要来学习Android开发中如何调用系统中蓝牙以及wifi的功能。
张哥编程
2024/12/17
1470
android 十八 蓝牙及Wi-Fi
在WiFi关闭状态连接已保存网络流程
WiFi关闭状态下在SavedNetwork界面点击CONNECT按钮,WiFI会自动打开并连接,下面是代码流程(本文档主要分析Settings层的逻辑,Framework层主要会用到打开wifi和连接的API,这里不做分析): android/packages/apps/Settings/res/values/strings.xml Connect
用户7557625
2020/07/15
1.8K0
Android11 WiFi相关代码改动记录
Android11已经发布,WiFi相关代码改动不大,在这里记录一下,方便日后做开发。
用户7557625
2021/01/18
3.1K0
自定义View,指示wifi信号强度(菜鸟历险记)
有经验的开发者可以忽略我这篇文章。我只想给如当年自学如我的菜鸟一个提示,由其是从一个陌生领域进入Android开发的没有任何人能指点的菜鸟。
Frank909
2019/01/14
1.6K0
相关推荐
Android自动连接指定的wifi,免密码或指定密码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验