android wifi信息获取

该博客主要展示了如何在Android中获取WiFi的相关信息,包括判断WiFi是否可用、获取当前连接的SSID、RSSI、链接速度,以及扫描并解析WiFi列表。此外,还提供了计算同频干扰和邻频干扰的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zznode.walktest.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import com.zznode.walktest.AppConstant;
import com.zznode.walktest.Entity.WifiListEntity;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Author by ckl, Email xx@xx.com, Date on 2020/7/8.
 * PS: Not easy to write code, please indicate.
 */
public class WifiUtil {
    private static WifiUtil instance = null;
    private final WifiManager mWifiManager;
    private Context mContext;

    private WifiUtil(Context context) {
        this.mContext = context;
        mWifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    }
    public static WifiUtil getInstance(Context context){
        if (instance == null){
            synchronized (WifiUtil.class){
                if (instance == null){
                    instance = new WifiUtil(context);
                }
            }
        }
        return instance;
    }

    /**
     * 判断wifi是否可用
     * @param
     * @return
     */
    public boolean isWiFiActive() {
        Context context = mContext.getApplicationContext();
        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    /**
     * 获取当前连接WIFI的SSID
     */
    public String getSSID() {
        assert mWifiManager != null;
        WifiInfo info = mWifiManager.getConnectionInfo();
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return info.getSSID();
            } else {
                return info.getSSID().replace("\"", "");
            }
    }

    /**
     * 获取当前连接WIFI的Rssi
     */
    public int getRssi() {
        assert mWifiManager != null;
        WifiInfo info = mWifiManager.getConnectionInfo();
        return info.getRssi();
    }

    /**
     * 获取连接速度  info.LINK_SPEED_UNITS 单位Mbps
     */
    public int getLinkSpeed(){
        assert mWifiManager != null;
        WifiInfo info = mWifiManager.getConnectionInfo();
        return info.getLinkSpeed();
    }
    /**
     * 获取wifi列表
     */
    public List<WifiListEntity> getWifiList(){
        List<ScanResult> scanResult = mWifiManager.getScanResults();
        /**
         * wifi列表
         */
        List<WifiListEntity> wifiList = new ArrayList<>();
        Iterator localIterator = scanResult.iterator();
        while (localIterator.hasNext()) {
            ScanResult sr = (ScanResult)localIterator.next();

            WifiListEntity we = new WifiListEntity();
            /*if(isHaveScanResult){*/
            we.setScanResult(sr);
            /*}*/
            we.setBssid(sr.BSSID);
            we.setSsid(sr.SSID);
            we.setCapabilities(sr.capabilities);
            we.setFrequency(sr.frequency);
            we.setLevel(sr.level);
            // 用传入的freq值进行判断,若在2400~2500之间,不含边界为24GHz
            //5GHz(frequency),即用自己的信道频率值进行判断,如果频率值在4900~5900之间
            if(sr.frequency>4900 &&sr.frequency<5900){
                we.setBand(AppConstant.CHANNEL_5G);
            }
            else if(sr.frequency>2400 &&sr.frequency<2500){
                we.setBand(AppConstant.CHANNEL_24G);
            }
            else{
                we.setBand(AppConstant.CHANNEL_5G);
            }
            we.setChannel(getChannel(sr.frequency));
            wifiList.add(we);
        }
        wifiList=WifiListEntity.sortSiganal(wifiList,1);
        return wifiList;
    }
    /**
     * 同频,信道相同(且信号高于-75dBm,不包括当前wifi)
     * @param
     * @param
     * @return
     */
    public int getCalSameFrequencyInterference(){
        assert mWifiManager != null;
        WifiInfo info = mWifiManager.getConnectionInfo();
        int localSfi=0;
           int channel = getChannel(info.getFrequency());
           List<WifiListEntity> wifiList = getWifiList();
        for( WifiListEntity we :wifiList){
            if(channel==we.getChannel() && we.getLevel() >= -55 && !we.isCurNetwork()){
                localSfi++;
            }
        }
        return localSfi;
    }


    /**
     * 邻频 前后2个频率的信道(且信号高于-75dBm)
     * @param
     * @param
     * @return
     */
    public int getCalNearbyFrequencyInterference()
    {
        assert mWifiManager != null;
        WifiInfo info = mWifiManager.getConnectionInfo();
        int localSfi=0;
        int channel = getChannel(info.getFrequency());
        List<WifiListEntity> wifiList = getWifiList();
        for( WifiListEntity we :wifiList){
            if((channel==we.getChannel()-1 || channel==we.getChannel()-2  ||   channel==we.getChannel()+1 || channel==we.getChannel()+2) && we.getLevel() >= -55){
                localSfi++;
            }
        }
        return localSfi;
    }

    /**
     * 根据频率获取信道
     * @param paramInt
     * @return
     */
    public static int getChannel(int paramInt) {
        if (paramInt > 10000) {
            paramInt /= 10000;
        }
        switch (paramInt) {
            default:
                return 0;
            case 2412:
                return 1;
            case 2417:
                return 2;
            case 2422:
                return 3;
            case 2427:
                return 4;
            case 2432:
                return 5;
            case 2437:
                return 6;
            case 2442:
                return 7;
            case 2447:
                return 8;
            case 2452:
                return 9;
            case 2457:
                return 10;
            case 2462:
                return 11;
            case 2467:
                return 12;
            case 2472:
                return 13;
            case 2484:
                return 14;
            case 5745:
                return 149;
            case 5765:
                return 153;
            case 5785:
                return 157;
            case 5805:
                return 161;
            case 5825:
                return 165;
            case 5180:
                return 36;
            case 5200:
                return 40;
            case 5220:
                return 44;
            case 5240:
                return 48;
            case 5260:
                return 52;
            case 5280:
                return 56;
            case 5300:
                return 60;
            case 5320:
                return 64;
            case 5500:
                return 100;
            case 5520:
                return 104;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值