小工具知识网

当前位置: 首页 > 行业知识 > Android 实现WiFi列表显示与连接,快速上手

行业知识

Android 实现WiFi列表显示与连接,快速上手

2026-11-08 15:46:43 来源:互联网转载

import android.widget.ProgressBar;

import android.widget.RelativeLayout;

import android.widget.CompoundButton.OnCheckedChangeListener;

import android.widget.Toast;

public class WifiListActivity extends Activity {

private ArrayList wifiArray;

private WiFiInfoAdapter wifiInfoAdapter;

private ListView listWifi;

private ProgressBar updateProgress;

private Button updateButton;

private String wifiPassword = null;

private WifiManager wifiManager;

private WifiAdmin wiFiAdmin;

private List list;

private ScanResult mScanResult;

private StringBuffer sb = new StringBuffer();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_wifi_list);

wiFiAdmin = new WifiAdmin(WifiListActivity.this);

initLayout();

getAllNetWorkList();

}

public void initLayout() {

listWifi = (ListView) findViewById(R.id.listWiFi);

RelativeLayout btnToSettingFromWiFi = (RelativeLayout) findViewById(R.id.btnToSettingFromWiFi);

btnToSettingFromWiFi.setOnClickListener(new MyOnClickListener());

// 刷新按钮和进度条

updateProgress = (ProgressBar) findViewById(R.id.updateProgress);

updateProgress.setVisibility(View.INVISIBLE);

updateButton = (Button) findViewById(R.id.updateButton);

updateButton.setVisibility(View.VISIBLE);

updateButton.setOnClickListener(new MyOnClickListener());

SwitchButton switchWifi = (SwitchButton) findViewById(R.id.switchWifi);

wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

switchWifi.setChecked(wifiManager.isWifiEnabled());

switchWifi.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView,

boolean isChecked) {

wifiManager.setWifiEnabled(isChecked);

// 更新WiFi列表

if (isChecked) {

listWifi.setVisibility(View.VISIBLE);

updateProgress.setVisibility(View.VISIBLE);

updateButton.setVisibility(View.INVISIBLE);

new Thread(new refreshWifiThread()).start();

} else {

listWifi.setVisibility(View.GONE);

}

}

});

}

final Handler refreshWifiHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case 1:

getAllNetWorkList();

updateProgress.setVisibility(View.INVISIBLE);

updateButton.setVisibility(View.VISIBLE);

break;

default:

break;

}

}

};

public class refreshWifiThread implements Runnable {

@Override

public void run() {

try {

Thread.sleep(3000);

Message message = new Message();

message.what = 1;

refreshWifiHandler.sendMessage(message);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

private class MyOnClickListener implements OnClickListener {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.btnToSettingFromWiFi:

finish();

break;

case R.id.updateButton:

updateButton.setVisibility(View.INVISIBLE);

updateProgress.setVisibility(View.VISIBLE);

new Thread(new refreshWifiThread()).start();

break;

default:

break;

}

}

}

public void getAllNetWorkList() {

wifiArray = new ArrayList();

if (sb != null) {

sb = new StringBuffer();

}

wiFiAdmin.startScan();

list = wiFiAdmin.getWifiList();

if (list != null) {

for (int i = 0; i

mScanResult = list.get(i);

WifiInfo wifiInfo = new WifiInfo(mScanResult.BSSID,

mScanResult.SSID, mScanResult.capabilities,

mScanResult.level);

wifiArray.add(wifiInfo);

}

wifiInfoAdapter = new WiFiInfoAdapter(getApplicationContext(),

wifiArray);

listWifi.setAdapter(wifiInfoAdapter);

//

wiFiAdmin.getConfiguration();

listWifi.setOnItemClickListener(new AdapterView.OnItemClickListener() {

String wifiItemSSID = null;

public void onItemClick(android.widget.AdapterView parent,

android.view.View view, int position, long id) {

Log.d(Constant.TAG, “BSSID:” + list.get(position).BSSID);

// 连接WiFi

wifiItemSSID = list.get(position).SSID;

int wifiItemId = wiFiAdmin.IsConfiguration(“”"

  • list.get(position).SSID + “”");

    if (wifiItemId != -1) {

    if (wiFiAdmin.ConnectWifi(wifiItemId)) {

    // 连接已保存密码的WiFi

    Toast.makeText(getApplicationContext(), “正在连接”,

    Toast.LENGTH_SHORT).show();

    updateButton.setVisibility(View.INVISIBLE);

    updateProgress.setVisibility(View.VISIBLE);

    new Thread(new refreshWifiThread()).start();

    }

    } else {

    // 没有配置好信息,配置

    WifiPswDialog pswDialog = new WifiPswDialog(

    WifiListActivity.this,

    new OnCustomDialogListener() {

    @Override

    public void back(String str) {

    wifiPassword = str;

    if (wifiPassword != null) {

    int netId = wiFiAdmin

    .AddWifiConfig(list,

    wifiItemSSID,

    wifiPassword);

    if (netId != -1) {

    wiFiAdmin.getConfiguration();// 添加了配置信息,要重新得到配置信息

    if (wiFiAdmin

    .ConnectWifi(netId)) {

    // 连接成功,刷新UI

    updateProgress

    .setVisibility(View.VISIBLE);

    updateButton

    .setVisibility(View.INVISIBLE);

    new Thread(

    new refreshWifiThread())

    .start();

    }

    } else {

    // 网络连接错误

    }

    } else {

    }

    }

    });

    pswDialog.show();

    }

    }

    });

    }

    }

    }

    然后是WiFiAdmin:

    package com.tchip.carlauncher.util;

    import java.util.List;

    import android.content.Context;

    import android.net.wifi.ScanResult;

    import android.net.wifi.WifiConfiguration;

    import android.net.wifi.WifiInfo;

    import android.net.wifi.WifiManager;

    import android.net.wifi.WifiManager.WifiLock;

    import android.util.Log;

    public class WifiAdmin {

    /**

    • 定义一个WifiManager对象,提供Wifi管理的各种主要API,主要包含wifi的扫描、建立连接、配置信息等

      */

      private WifiManager mWifiManager;

      // WIFIConfiguration描述WIFI的链接信息,包括SSID、SSID隐藏、password等的设置

      private List wifiConfigList;

      // 定义一个WifiInfo对象

      private WifiInfo mWifiInfo;

      // 扫描出的网络连接列表

      private List mWifiList;

      // 网络连接列表

      private List mWifiConfigurations;

      WifiLock mWifiLock;

      public static final int TYPE_NO_PASSWD = 0x11;

      public static final int TYPE_WEP = 0x12;

      public static final int TYPE_WPA = 0x13;

      public WifiAdmin(Context context) {

      // 获得WifiManager对象

      mWifiManager = (WifiManager) context

      .getSystemService(Context.WIFI_SERVICE);

      // 取得WifiInfo对象

      mWifiInfo = mWifiManager.getConnectionInfo();

      }

      /**

      • 打开wifi

        */

        public void openWifi() {

        if (!mWifiManager.isWifiEnabled()) {

        mWifiManager.setWifiEnabled(true);

        }

        }

        /**

        • 关闭wifi

          */

          public void closeWifi() {

          if (!mWifiManager.isWifiEnabled()) {

          mWifiManager.setWifiEnabled(false);

          }

          }

          /**

          • 检查当前wifi状态

          • @return

            */

            public int checkState() {

            return mWifiManager.getWifiState();

            }

            /**

            • 锁定wifiLock

              */

              public void acquireWifiLock() {

              mWifiLock.acquire();

              }

              /**

              • 解锁wifiLock

                */

                public void releaseWifiLock() {

                // 判断是否锁定

                if (mWifiLock.isHeld()) {

                mWifiLock.acquire();

                }

                }

                /**

                • 创建一个wifiLock

                  */

                  public void createWifiLock() {

                  mWifiLock = mWifiManager.createWifiLock(“test”);

                  }

                  /**

                  • 得到配置好的网络

                  • @return

                    */

                    public List getWiFiConfiguration() {

                    return mWifiConfigurations;

                    }

                    /**

                    • 指定配置好的网络进行连接

                    • @param index

                      */

                      public void connetionConfiguration(int index) {

                      if (index > mWifiConfigurations.size()) {

                      return;

                      }

                      // 连接配置好指定ID的网络

                      mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId,

                      true);

                      }

                      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

                      深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

                      因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

                      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

                      由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

                      如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)

                      如何做好面试突击,规划学习方向?

                      面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

                      网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

                      学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

                      我们搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

                      我们在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

                      50932)]

                      [外链图片转存中…(img-c3p9zXxN-1711543250932)]

                      由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

                      如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)

                      [外链图片转存中…(img-gL83rs7A-1711543250932)]

                      如何做好面试突击,规划学习方向?

                      面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

                      网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

                      学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

                      我们搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

                      [外链图片转存中…(img-zmLm4a0S-1711543250933)]

                      我们在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

                      本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

上一篇:扩展服务器命令栏怎么设置?

下一篇:揭秘夹娃娃游戏源码,掌握核心机制,成为游戏高手!