常用wifi功能集合工具类

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import org.apache.http.conn.util.InetAddressUtils;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

import com.clly.filemaster.conf.Constants;

/**
 * @创建者 CSDN_LQR
 * @创建时间 2016-3-21 下午8:23:43
 * @描述 wifi及热点工具类
 */
public class WifiUtils {

    private static WifiUtils mWifiUtils;
    private WifiManager mWifiManager;
    private Context context;
    private WifiApStateListener mWifiApStateListener;
    private WifiStateListener mWifiStateListener;

    // 热点监听的回调接口的Setter方法
    public void setWifiApStateListener(WifiApStateListener wifiApStateListener) {
        mWifiApStateListener = wifiApStateListener;
    }

    // wifi监听的回调接口的Setter方法
    public void setWifiStateListener(WifiStateListener wifiStateListener) {
        mWifiStateListener = wifiStateListener;
    }

    // app标记,用于设置ap的名字头
    private static final String APPTAG = Constants.APPNAME;
    // wifi热点状态的意图广播
    private static final String WIFI_AP_STATE = "android.net.wifi.WIFI_AP_STATE_CHANGED";
    // 意图中的一个传值
    private static final String WIFI_STATE = "wifi_state";

    // 热点名字和密码的标记
    public static final String SSID = "SSID";
    public static final String PASSWORD = "PASSWORD";

    // 热点的名字和密码
    private String mySSID = "";
    private String myPassword = "";

    private WifiApStateReceiver mWifiApStateReceiver;
    private WifiStateReceiver mWifiStateReceiver;

    private WifiUtils(Context context) {
        super();
        this.context = context;
        // 在构造方法中实例化WifiManager
        mWifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);

        // 设置默认的热点ssid和passwrod
        // mySSID = APPTAG + getRandomPassword();
        // myPassword = getRandomPassword();
        mySSID = APPTAG + "12345678";
        myPassword = "12345678";
    }

    /**
     * 单例模式得到wifiUtils对象
     * 
     * @param context
     * @return
     */
    public static WifiUtils getInstace(Context context) {
        if (mWifiUtils == null) {
            synchronized (WifiUtils.class) {
                if (mWifiUtils == null) {
                    mWifiUtils = new WifiUtils(context);
                }
            }
        }
        return mWifiUtils;
    }

    /* ============================ wifi热点方法begin ============================ */

    /**
     * 设置热点
     * 
     * @param SSID
     *            热点的名字
     * @param PASSWORD
     *            热点的密码
     */
    public void setWifiAPInfo(String SSID, String PASSWORD) {
        this.mySSID = SSID;
        this.myPassword = PASSWORD;
    }

    /**
     * 返回热点的ssid和password
     * 
     * @return
     */
    public HashMap<String, String> getWifiAPInfo() {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put(SSID, mySSID);
        hashMap.put(PASSWORD, myPassword);
        return hashMap;
    }

    /**
     * wifi热点开关
     * 
     * @param enabled
     *            是否可用
     * @return
     */
    public boolean setWifiApEnabled(boolean enabled) {
        if (enabled) {
            // wifi和热点不能同时打开,所以打开热点的时候需要关闭wifi
            setWifiEnabled(false);
            // 一关闭wifi就关闭广播监听
            if (mWifiStateReceiver != null) {
                context.unregisterReceiver(mWifiStateReceiver);
                mWifiStateReceiver = null;
            }

            // 开启wifi热点时就开启广播监听,监听热点的状态
            IntentFilter filter = new IntentFilter();
            filter.addAction(WIFI_AP_STATE);
            mWifiApStateReceiver = new WifiApStateReceiver();
            context.registerReceiver(mWifiApStateReceiver, filter);

        } else {
            // 一关闭wifi热点就关闭广播监听
            if (mWifiApStateReceiver != null) {
                context.unregisterReceiver(mWifiApStateReceiver);
                mWifiApStateReceiver = null;
            }
        }

        try {

            // 热点的配置类
            WifiConfiguration apConfig = new WifiConfiguration();
            // 配置热点的名称
            apConfig.SSID = mySSID;
            // 配置热点的密码
            apConfig.preSharedKey = myPassword;

            // 一些热点的详细配置
            apConfig.allowedAuthAlgorithms
                    .set(WifiConfiguration.AuthAlgorithm.OPEN);
            apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            apConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            apConfig.allowedKeyManagement
                    .set(WifiConfiguration.KeyMgmt.WPA_PSK);
            apConfig.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            apConfig.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            apConfig.allowedGroupCiphers
                    .set(WifiConfiguration.GroupCipher.CCMP);
            apConfig.allowedGroupCiphers
                    .set(WifiConfiguration.GroupCipher.TKIP);
            // 通过反射调用设置热点
            Method method = mWifiManager.getClass().getMethod(
                    "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
            // 返回热点打开状态
            return (Boolean) method.invoke(mWifiManager, apConfig, enabled);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /* ============================ wifi热点方法end ============================ */
    /**
     * 获得本机的ip地址
     */
    public String getServerIp() {
        DhcpInfo info = mWifiManager.getDhcpInfo();
        String ip = intToIp(info.serverAddress);
        return ip;
    }

    public String getIp() {
        String ipaddress = "";
        try {
            Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces();
            while (en.hasMoreElements()) {
                NetworkInterface nif = en.nextElement();
                Enumeration<InetAddress> inet = nif.getInetAddresses();
                while (inet.hasMoreElements()) {
                    InetAddress ip = inet.nextElement();
                    if (!ip.isLoopbackAddress()
                            && InetAddressUtils.isIPv4Address(ip
                                    .getHostAddress())) {
                        return ipaddress = ip.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return ipaddress;
    }

    /**
     * 把int形式的ip地址转换劢string形式
     * 
     * @param i
     * @return
     */
    private String intToIp(int i) {

        return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF)
                + "." + (i >> 24 & 0xFF);
    }

    /**
     * 得到一连串的10位数字,用于生成随机密码
     * 
     * @return
     */
    private String getRandomPassword() {
        String result = "";
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            result += random.nextInt(10) + "";
        }
        return result;
    }

    /**
     * 热点的广播接收者
     * 
     * @author Administrator
     * 
     */
    class WifiApStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (WIFI_AP_STATE.equals(intent.getAction())) {
                // 便携式热点的状态为:10---正在关闭;11---已关闭;12---正在开启;13---已开启
                int state = intent.getIntExtra(WIFI_STATE, 0);
                switch (state) {
                case 10:
                    if (mWifiApStateListener != null)
                        mWifiApStateListener.onClosing();
                    break;
                case 11:
                    if (mWifiApStateListener != null)
                        mWifiApStateListener.onClosed();
                    break;
                case 12:
                    if (mWifiApStateListener != null)
                        mWifiApStateListener.onStarting();
                    break;
                case 13:
                    if (mWifiApStateListener != null)
                        mWifiApStateListener.onStarted();
                    break;

                default:
                    break;
                }
            }
        }
    }

    /**
     * wifi热点状态监听接口
     * 
     * @author Administrator
     * 
     */
    public interface WifiApStateListener {
        // 10---正在关闭;11---已关闭;12---正在开启;13---已开启
        void onClosing();

        void onClosed();

        void onStarting();

        void onStarted();
    }

    /* ============================ wifi方法 begin ============================ */

    /**
     * 判断wifi是否处理开启状态
     * 
     * @param context
     * @return
     */
    public boolean isWifiOpen(Context context) {
        // 获取系统服务
        ConnectivityManager manager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        // 获取状态
        State wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                .getState();
        // 判断wifi已连接的条件
        if (wifi == State.CONNECTED || wifi == State.CONNECTING) {
            return true;
        }
        return false;
    }

    /**
     * 得到当前连接的Wifi名称(ssid)
     * 
     * @return
     */
    public String getConnectWifiSsid(Context context) {
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        // Log.d("wifiInfo", wifiInfo.toString());
        // Log.d("SSID", wifiInfo.getSSID());
        return wifiInfo.getSSID();
    }

    /**
     * 设置Wifi开关
     * 
     */
    public void setWifiEnabled(boolean enabled) {

        // 打开Wifi
        if (enabled) {
            // 关闭AP热点
            setWifiApEnabled(false);
            // 一关闭wifi热点就关闭广播监听
            if (mWifiApStateReceiver != null) {
                context.unregisterReceiver(mWifiApStateReceiver);
                mWifiApStateReceiver = null;
            }

            // 开启wifi时就开启广播监听,监听热点的状态
            IntentFilter filter = new IntentFilter();
            filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
            filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            mWifiStateReceiver = new WifiStateReceiver();
            context.registerReceiver(mWifiStateReceiver, filter);

        } else {
            // 关闭wifi时,取消监听
            if (mWifiStateReceiver != null) {
                context.unregisterReceiver(mWifiStateReceiver);
                mWifiStateReceiver = null;
            }
        }

        // 打开wifi或关闭wifi
        mWifiManager.setWifiEnabled(enabled);

    }

    /**
     * 添加一个网络并连接
     * 
     * @param wcg
     */
    private boolean addNetwork(WifiConfiguration wcg) {
        int wcgID = mWifiManager.addNetwork(wcg);
        return mWifiManager.enableNetwork(wcgID, true);
    }

    /**
     * 创建一个wifi信息
     * 
     * @param SSID
     * @param Password
     * @param Type
     * @return
     */
    private WifiConfiguration CreateWifiInfo(String SSID, String Password,
            int Type) {
        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID = "\"" + SSID + "\"";

        WifiConfiguration tempConfig = 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) {
        List<WifiConfiguration> existingConfigs = mWifiManager
                .getConfiguredNetworks();
        for (WifiConfiguration existingConfig : existingConfigs) {
            if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
                return existingConfig;
            }
        }
        return null;
    }

    /**
     * 连接到指定Wifi
     * 
     * @param ssid
     * @param password
     * @param wifiStateListener
     */
    public boolean connectToWifi(String ssid, String password) {
        WifiConfiguration createWifiInfo = CreateWifiInfo(ssid, password, 3);
        return addNetwork(createWifiInfo);
    }

    /**
     * wifi的广播接收者
     * 
     * @author Administrator
     * 
     */
    private class WifiStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (WifiManager.WIFI_STATE_CHANGED_ACTION
                    .equals(intent.getAction())) {// 这个监听wifi的打开与关闭,与wifi的连接无关
                int wifiState = intent.getIntExtra(
                        WifiManager.EXTRA_WIFI_STATE, 0);
                switch (wifiState) {
                case WifiManager.WIFI_STATE_DISABLED:
                    if (mWifiStateListener != null)
                        mWifiStateListener.onDisabled();
                    break;
                case WifiManager.WIFI_STATE_DISABLING:
                    if (mWifiStateListener != null)
                        mWifiStateListener.onDisabling();
                    break;
                case WifiManager.WIFI_STATE_ENABLED:
                    if (mWifiStateListener != null)
                        mWifiStateListener.onEnabled();
                    break;
                case WifiManager.WIFI_STATE_ENABLING:
                    if (mWifiStateListener != null)
                        mWifiStateListener.onEnabling();
                    break;
                case WifiManager.WIFI_STATE_UNKNOWN:
                    if (mWifiStateListener != null)
                        mWifiStateListener.onUnknow();
                    break;
                }
            }
        }
    }

    /**
     * wifi状态监听接口
     * 
     * @author Administrator
     * 
     */
    public interface WifiStateListener {
        void onDisabled();

        void onDisabling();

        void onEnabled();

        void onEnabling();

        void onUnknow();
    }

    /**
     * 得到周围的wifi
     * 
     * @return
     */
    public List<ScanResult> getWifiScanResult() {
        // 使用wifiManager得到周边所有的wifi
        List<ScanResult> scanResults = mWifiManager.getScanResults();
        // 信号从强到弱排序
        sortByLevel(scanResults);
        return scanResults;
    }

    // 将搜索到的wifi根据信号强度从强到弱进行排序
    private void sortByLevel(List<ScanResult> list) {
        for (int i = 1; i <= list.size(); i++) {
            for (int j = list.size() - 1; j >= 1; j--) {
                if (list.get(j).level > list.get(j - 1).level) {

                    ScanResult temp = null;
                    temp = list.get(j);
                    list.set(j, list.get(j - 1));
                    list.set(j - 1, temp);
                }
            }
        }
    }

    /**
     * 判断wifi网络是否稳定(需要子线程)
     * 
     * @return
     */
    public boolean isWifiStable() {
        boolean isStable = false;

        try {
            /*
             * ping -c 3 -w 100 中 , -c 是指ping的次数 3是指ping 3次 , -w
             * 100以秒为单位指定超时间隔,是指超时时间为100秒
             */
            Process process = Runtime.getRuntime().exec(
                    "ping -c 3 -w 5 192.168.43.1");
            int status = process.waitFor();

            if (status == 0) {
                // 连接正常
                isStable = true;
            } else {
                // 连接异常
                // Fail:Host unreachable
                isStable = false;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return isStable;
    }

    /* ============================ wifi方法 end ============================ */

    /* ============================ 加密ssid和password ============================ */
    /**
     * 加密连接参数(热点的ssid和密码)
     * 
     * @return encrypt(ssid + tag + password)
     */
    public String getEncryptParams(String ssid, String password) {
        // 对真正的ssid和password加密
        String encryptParams = "";
        try {
            // 加密ssid + tag + password
            encryptParams = AESUtils
                    .encrypt(ssid + Constants.APPTAG + password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回加密后的ssid + tag + password
        return encryptParams;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hutool是一个Java工具类库,提供了丰富的工具类来方便Java开发人员快速开发,其中也包括了针对集合工具类。 hutool集合工具类提供了丰富的API,包括对List、Queue、Stack、Map等集合数据结构的操作和处理。 其中,hutool提供的ListUtil工具类可以实现对List集合的排序、分页、去重等操作。QueueUtil和StackUtil工具类可以方便地对队列和栈进行push、pop等操作。MapUtil工具类则提供了map集合的常见操作,如put、get、remove等。 除了常见的集合类型,hutool还提供了TreeUtil工具类,可以方便的操作树型结构的集合数据。 hutool集合工具类的设计追求简洁易用,内部实现也采用了高效的算法。并且,hutool集合工具类的代码开源,易于修改和扩展。 综上,hutool集合工具类可以大大提高Java开发人员的开发效率和代码质量,是一款不可多得的Java工具库。 ### 回答2: hutool是一个Java工具包,其中包含了许多实用工具类。在其中,集合工具类对于Java程序员来说相当重要。 hutool中的集合工具类提供了简单、高效、易用的方法来操作集合对象。例如,可以使用ListUtil、SetUtil、MapUtil等工具类对List、Set、Map等集合进行快速操作,如转换、去重、排序、过滤、判空等。 其中,集合转换是hutool集合工具类的常见用途之一,可以将一个集合类型转换成另一种集合类型,比如将List转换成Set或Map,还可以指定Key和Value的转换器,让转换更加灵活和自由。同时,hutool集合工具类还提供了快捷的创建空集合和不可变集合的方法,非常方便,也能避免空指针异常等问题。 另外,hutool集合工具类还具有比较高的通用性,可以应用在各类Java程序开发中,涵盖了Spring、Mybatis、Hibernate等框架,还比较适用于处理大数据量的集合操作。 总的来说,hutool集合工具类是一款非常实用的Java工具包,对于开发人员来说是不可或缺的。它简化了集合操作的流程,提高了代码的编写效率和可读性。如果你还没有使用过hutool集合工具类,不妨尝试一下,它一定会给你的开发工作带来便利。 ### 回答3: Hutool是一个Java工具类库,它为Java开发人员提供了很多实用的工具类,其中就包括集合工具类。Hutool集合工具类提供了一系列实用的方法,可以使Java开发人员更加便捷地操作集合,提升了开发效率。 Hutool集合工具类包含了对List、Set、Map等Java集合的操作。其中,对List操作的方法包括list转为数组、按照元素属性排序、去重、过滤等;对Set操作的方法包括set转为数组、去重、求交集、判断子集等;对Map操作的方法包括取最大值、取最小值、map转为List、根据value排序、根据value取key等。 Hutool集合工具类中也提供了一些特殊的数据结构,例如MultiValueMap,它可以将一个key对应多个value的情况存储在同一个Map中。同时,Hutool还提供了一些便捷的工具方法,例如采用Lambda表达式过滤集合、统计集合元素个数、集合元素分组等。 Hutool集合工具类的使用非常简单,只需导入相应的工具类包,即可使用其中的方法。例如,使用ListUtil中的distinct方法去重List可以直接调用ListUtil.distinct(list)即可。另外,Hutool集合工具类中的方法都提供了详细的文档说明,使开发人员更容易理解和使用。 总之,Hutool集合工具类提供了很多实用的方法,可以帮助Java开发人员更加便捷地操作集合,提升开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值