Android连续获取当前所连接WiFi及周围热点列表信息的解决方案
2017-07-26 12:01
771 查看
基础知识:
Android的wifi信息获取先要自学相关基础知识,下面是相关基础知识。获取系统wifi服务
// 获取系统wifi服务 WifiManage wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); // 获取当前所连接wifi的信息 WifiInfo wi = wm.getConnectionInfo(); // 获取扫描到的所有wifi信息 List<ScanResult> scanResults = wm.getScanResults();
获取wifi信息的各种方法及异同
这里只简略地提及WifiManage, WifiInfo, ScanResult 这三个类的一些方法,如果非常感兴趣可以去安卓社区看看。废话不多说,Here we go!WifiManage类wifi信息获取方法
wm.getConnectionInfo(); // 获取当前连接信息 wm.getWifiState(); // 获取当前手机wifi网卡状态 wm.getScanResults(); // 获取扫描到的wifi信息列表(返回类型是链表)
手机wifi网卡状态分五种情况
wifi网卡状态 | 详细说明 |
---|---|
WifiManager.WIFI_STATE_ENABLED | wifi网卡可用 |
WifiManager.WIFI_STATE_DISABLED | wifi网卡不可用 |
WifiManager.WIFI_STATE_DISABLING | wifi网卡正关闭 |
WifiManager.WIFI_STATE_ENABLING | wifi网卡正打开 |
WifiManager.WIFI_STATE_UNKNOWN | 状态未知 |
权限代码 | 详细说明 |
---|---|
ACCESS_WIFI_STATE | 允许程序获得wifi的状态信息 |
INTERNET | 允许程序获得手机网络权限 |
CHANGE_NETWORK_STATE | 允许应用程序改变wifi连接状态 |
WifiInfo类方法
wi.getSSID(); // 获取当前连接wifi的名词 wi.getBSSID(); // 获取路由器Mac地址,String类型 wi.getMacAddress(); // 获取本机Mac地址 wi.getRssi(); // 获取当前连接wifi的信号强度 wi.getLinkSpeed(); // 获取连接速度 WifiInfo.LINK_SPEED_UNITS; // 连接速度单位
wi.getRssi()获取的就是所连接wifi的RSSI1
ScanResult类方法
scanResult.SSID(); scanResult.BSSID(); scanResult.level(); // 信号强度(原始数据) WifiManager.calculateSignalLevel(scanResult.level(),5); // 计算强度等级,此处分5级。
利用多线程实现数据的持续性采集
安卓中事件处理的原则:所有可能耗时的操作都放到其他线程去处理。根据这一原则,我们将wifi系统服务获取、信息获取等都放在一个线程中实现,定义每500ms采样一次。这样为主线程瘦身就能大大加快应用程序响应时间,改善用户体验。由于自己也刚接触Android多线程,这里就不多说了,感兴趣的同学可以去上网搜索相关内容。代码展示
下面的是activity_main.xml文件中的代码,第二个布局控件LinearLayout设为垂直滚动视图,以便显示足够多的wifi信息。<?xml version="1.0" encoding="utf-8"? <android.support.constraint.ConstraintLayout 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="com.example.lenovo.wifi_bluetooth.MainActivity"> <RelativeLayout android:id="@+id/relativelayout1" android:gravity="start|center_vertical" android:layout_width="368dp" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/Curr_connected_wifi" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:orientation="vertical"> <TextView android:id="@+id/testView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/str2"/> <EditText android:id="@+id/et1" android:layout_width="match_parent" android:layout_height="wrap_content" android:cursorVisible="false" android:focusable="false" android:focusableInTouchMode="false" /> </LinearLayout> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/Curr_connected_wifi" android:scrollbars="vertical" android:fadingEdge="vertical"> <LinearLayout android:id="@+id/list_wifi" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/testView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/str1" /> <EditText android:id="@+id/et2" android:layout_width="match_parent" android:layout_height="wrap_content" android:cursorVisible="false" android:focusable="false" android:focusableInTouchMode="false" /> </LinearLayout> </ScrollView> </RelativeLayout> </android.support.constraint.ConstraintLayout>
接下来是文件MActivity.java代码:
package com.example.lenovo.wifi_bluetooth; import android.net.wifi.ScanResult; import java.util.List; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private WifiManager wm; EditText editText1 ; EditText editText2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new tvThread().start(); } private class tvThread extends Thread { @Override public void run() { while (true) { runOnUiThread(new Runnable() { @Override public void run() { obtainListInfo(); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { 9b00 e.printStackTrace(); } } } } private void obtainListInfo(){ //----------------------------------------------> editText1 = (EditText) findViewById(R.id.et1); editText2 = (EditText) findViewById(R.id.et2); //显示扫描到的所有wifi信息 wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); WifiInfo wi = wm.getConnectionInfo(); int strength = wi.getRssi(); int speed = wi.getLinkSpeed(); String designation = wi.getSSID(); String addr = wi.getBSSID(); String unit = WifiInfo.LINK_SPEED_UNITS; if (wm.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { StringBuilder listinfo = new StringBuilder(); //搜索到的wifi列表信息 List<ScanResult> scanResults = wm.getScanResults(); for (ScanResult sr:scanResults){ listinfo.append("wifi网络ID:"); listinfo.append(sr.SSID); listinfo.append("\nwifi MAC地址:"); listinfo.append(sr.BSSID); listinfo.append("\nwifi信号强度:"); listinfo.append(sr.level+"\n\n"); } editText2.setText(listinfo.toString()); String curr_connected_wifi=null; curr_connected_wifi="Currently connecting WiFi \'"+designation+"\' \nRssi: "+strength+ "\nMac addr: "+addr+"\nspeed: "+speed+" "+unit; editText1.setText(curr_connected_wifi.toString()); } //-------------------------------------------------------------------> } }
在AndroidManifest.xml文件中添加如下代码以开启权限:
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
大功告成,这是我的测试结果:
http://blog.csdn.net/zd_1471278687/article/details/12158367
http://blog.csdn.net/zd_1471278687/article/details/12158367
“RSSI”全称为“Received Signal Strength Indication”,即(接收)信号强度指示。在这里返回一个0~-100之间的int型数据。一般而言,大小在0~-50表示信号最好,-50~-70信号较差,小于-70信号最差,可能连接不上或掉线,通常值为-200时表示wifi已断。 ↩
相关文章推荐
- android 手机获取当前连接的wifi配置信息
- Android wifi通信 开发(wifi列表 +连接具体的wifi热点+socket的获取) 之 解决热点连成功的时延问题
- android 手机获取当前连接的wifi配置信息
- Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息),androidwifi
- Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息)
- Android获取当前的网络连接信息和网络链接状态 GPRS 和 WiFi网络
- Android之获取当前连接WiFi的信息
- Android获取当前连接的wifi名称
- ios开发 如何在应用内获取当前周围wifi列表和强度 并实现在应用内控制wifi开关
- Android 获取当前网络连接的类型信息
- Android 开启个人热点时 获取连接人数以及连接上的设备信息
- Android系统信息获取 之十四:获取WIFI热点相关信息
- 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点
- 安卓手机获取当前连接的WIFI相关信息
- android获取连接到手机热点上的设备的信息
- ios获取当前wifi热点信息
- android 如何获取连接wifi热点的设备数量
- 00_01_android获取连接到手机热点上的设备的信息
- Android获取当前连接wifi的信道
- Android开发周围wifi热点和属性的获取