基础知识:

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_ENABLEDwifi网卡可用WifiManager.WIFI_STATE_DISABLEDwifi网卡不可用WifiManager.WIFI_STATE_DISABLINGwifi网卡正关闭WifiManager.WIFI_STATE_ENABLINGwifi网卡正打开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) {
                    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"/>

大功告成,这是我的测试结果:
height="498" width="710" src="http://player.youku.com/player.php/sid/XMjkyNDY1NDMwOA==/v.swf">


  1. “RSSI”全称为“Received Signal Strength Indication”,即(接收)信号强度指示。在这里返回一个0~-100之间的int型数据。一般而言,大小在0~-50表示信号最好,-50~-70信号较差,小于-70信号最差,可能连接不上或掉线,通常值为-200时表示wifi已断。 ↩