zoukankan      html  css  js  c++  java
  • Android Wifi Hotspot Manager Class

    http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

    package com.whitebyte.wifihotspotutils;
     
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.net.InetAddress;
    import java.util.ArrayList;
     
    import android.content.Context;
    import android.net.wifi.WifiConfiguration;
    import android.net.wifi.WifiManager;
    import android.util.Log;
     
    public class WifiApManager {
        private final WifiManager mWifiManager;
     
        public WifiApManager(Context context) {
            mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        }
     
        /**
         * Start AccessPoint mode with the specified
         * configuration. If the radio is already running in
         * AP mode, update the new configuration
         * Note that starting in access point mode disables station
         * mode operation
         * @param wifiConfig SSID, security and channel details as part of WifiConfiguration
         * @return {@code true} if the operation succeeds, {@code false} otherwise
         */
        public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
            try {
                if (enabled) { // disable WiFi in any case
                    mWifiManager.setWifiEnabled(false);
                }
     
                Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                return (Boolean) method.invoke(mWifiManager, wifiConfig, enabled);
            } catch (Exception e) {
                Log.e(this.getClass().toString(), "", e);
                return false;
            }
        }
     
        /**
         * Gets the Wi-Fi enabled state.
         * @return {@link WIFI_AP_STATE}
         * @see #isWifiApEnabled()
         */
        public WIFI_AP_STATE getWifiApState() {
            try {
                Method method = mWifiManager.getClass().getMethod("getWifiApState");
     
                int tmp = ((Integer)method.invoke(mWifiManager));
     
                // Fix for Android 4
                if (tmp > 10) {
                    tmp = tmp - 10;
                }
     
                return WIFI_AP_STATE.class.getEnumConstants()[tmp];
            } catch (Exception e) {
                Log.e(this.getClass().toString(), "", e);
                return WIFI_AP_STATE.WIFI_AP_STATE_FAILED;
            }
        }
     
        /**
         * Return whether Wi-Fi AP is enabled or disabled.
         * @return {@code true} if Wi-Fi AP is enabled
         * @see #getWifiApState()
         *
         * @hide Dont open yet
         */
        public boolean isWifiApEnabled() {
            return getWifiApState() == WIFI_AP_STATE.WIFI_AP_STATE_ENABLED;
        }
     
        /**
         * Gets the Wi-Fi AP Configuration.
         * @return AP details in {@link WifiConfiguration}
         */
        public WifiConfiguration getWifiApConfiguration() {
            try {
                Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");
                return (WifiConfiguration) method.invoke(mWifiManager);
            } catch (Exception e) {
                Log.e(this.getClass().toString(), "", e);
                return null;
            }
        }
     
        /**
         * Sets the Wi-Fi AP Configuration.
         * @return {@code true} if the operation succeeded, {@code false} otherwise
         */
        public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) {
            try {
                Method method = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
                return (Boolean) method.invoke(mWifiManager, wifiConfig);
            } catch (Exception e) {
                Log.e(this.getClass().toString(), "", e);
                return false;
            }
        }
     
        /**
         * Gets a list of the clients connected to the Hotspot, reachable timeout is 300
         * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
         * @return ArrayList of {@link ClientScanResult}
         */
        public ArrayList<ClientScanResult> getClientList(boolean onlyReachables) {
            return getClientList(onlyReachables, 300);
        }
     
        /**
         * Gets a list of the clients connected to the Hotspot 
         * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
         * @param reachableTimeout Reachable Timout in miliseconds
         * @return ArrayList of {@link ClientScanResult}
         */
        public ArrayList<ClientScanResult> getClientList(boolean onlyReachables, int reachableTimeout) {
            BufferedReader br = null;
            ArrayList<ClientScanResult> result = null;
     
            try {
                result = new ArrayList<ClientScanResult>();
                br = new BufferedReader(new FileReader("/proc/net/arp"));
                String line;
                while ((line = br.readLine()) != null) {
                    String[] splitted = line.split(" +");
     
                    if ((splitted != null) && (splitted.length >= 4)) {
                        // Basic sanity check
                        String mac = splitted[3];
     
                        if (mac.matches("..:..:..:..:..:..")) {
                            boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);
     
                            if (!onlyReachables || isReachable) {
                                result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable));
                            }
                        }
                    }
                }
            } catch (Exception e) {
                Log.e(this.getClass().toString(), e.getMessage());
            } finally {
                try {
                    br.close();
                } catch (IOException e) {
                    Log.e(this.getClass().toString(), e.getMessage());
                }
            }
     
            return result;
        }
    }

    http://xiaxingwork.iteye.com/blog/1727722

    以下基于android ics系统

    Android AP接口属性为 @hide,不对外开放,但通过revoke机制调用到。

    Ap的几个重要接口

    getWifiApState

    setWifiApEnabled

    getWifiApConfiguration

    isWifiApEnabled

    package com.lenovo.channel.method.ap.hotspot;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    import android.net.wifi.WifiConfiguration;
    import android.net.wifi.WifiManager;
    import android.os.Build;
    
    import com.lenovo.channel.method.ap.hotspot.Hotspot.WifiApState;
    import com.lenovo.common.BeanUtils;
    import com.lenovo.common.Logger;
    
    class WifiApManager {
        private static final String tag = "WifiApManager";
    
        private static final String METHOD_GET_WIFI_AP_STATE = "getWifiApState";
        private static final String METHOD_SET_WIFI_AP_ENABLED = "setWifiApEnabled";
        private static final String METHOD_GET_WIFI_AP_CONFIG = "getWifiApConfiguration";
        private static final String METHOD_IS_WIFI_AP_ENABLED = "isWifiApEnabled";
    
        private static final Map<String, Method> methodMap = new HashMap<String, Method>();
        private static Boolean mIsSupport;
        private static boolean mIsHtc;
    
        public synchronized static final boolean isSupport() {
            if (mIsSupport != null) {
                return mIsSupport;
            }
    
            boolean result = Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO;
            if (result) {
                try {
                    Field field = WifiConfiguration.class.getDeclaredField("mWifiApProfile");
                    mIsHtc = field != null;
                } catch (Exception e) {
                }
            }
    
            if (result) {
                try {
                    String name = METHOD_GET_WIFI_AP_STATE;
                    Method method = WifiManager.class.getMethod(name);
                    methodMap.put(name, method);
                    result = method != null;
                } catch (SecurityException e) {
                    Logger.e(tag, "SecurityException", e);
                } catch (NoSuchMethodException e) {
                    Logger.e(tag, "NoSuchMethodException", e);
                }
            }
            
            if (result) {
                try {
                    String name = METHOD_SET_WIFI_AP_ENABLED;
                    Method method = WifiManager.class.getMethod(name, WifiConfiguration.class, boolean.class);
                    methodMap.put(name, method);
                    result = method != null;
                } catch (SecurityException e) {
                    Logger.e(tag, "SecurityException", e);
                } catch (NoSuchMethodException e) {
                    Logger.e(tag, "NoSuchMethodException", e);
                }
            }
    
            if (result) {
                try {
                    String name = METHOD_GET_WIFI_AP_CONFIG;
                    Method method = WifiManager.class.getMethod(name);
                    methodMap.put(name, method);
                    result = method != null;
                } catch (SecurityException e) {
                    Logger.e(tag, "SecurityException", e);
                } catch (NoSuchMethodException e) {
                    Logger.e(tag, "NoSuchMethodException", e);
                }
            }
    
            if (result) {
                try {
                    String name = getSetWifiApConfigName();
                    Method method = WifiManager.class.getMethod(name, WifiConfiguration.class);
                    methodMap.put(name, method);
                    result = method != null;
                } catch (SecurityException e) {
                    Logger.e(tag, "SecurityException", e);
                } catch (NoSuchMethodException e) {
                    Logger.e(tag, "NoSuchMethodException", e);
                }
            }
    
            if (result) {
                try {
                    String name = METHOD_IS_WIFI_AP_ENABLED;
                    Method method = WifiManager.class.getMethod(name);
                    methodMap.put(name, method);
                    result = method != null;
                } catch (SecurityException e) {
                    Logger.e(tag, "SecurityException", e);
                } catch (NoSuchMethodException e) {
                    Logger.e(tag, "NoSuchMethodException", e);
                }
            }
    
            mIsSupport = result;
            return isSupport();
        }
    
        private final WifiManager mWifiManager;
        WifiApManager(WifiManager manager) {
            if (!isSupport()) {
                throw new RuntimeException("Unsupport Ap!");
            }
            Logger.i(tag, "Build.BRAND -----------> " + Build.BRAND);
            
            mWifiManager = manager;
        }
        public WifiManager getWifiManager() {
            return mWifiManager;
        }
    
        public int getWifiApState() {
            try {
                Method method = methodMap.get(METHOD_GET_WIFI_AP_STATE);
                return (Integer) method.invoke(mWifiManager);
            } catch (Exception e) {
                Logger.e(tag, e.getMessage(), e);
            }
            return WifiApState.WIFI_AP_STATE_UNKWON;
        }
        
        private WifiConfiguration getHtcWifiApConfiguration(WifiConfiguration standard){
            WifiConfiguration htcWifiConfig = standard;
            try {
                Object mWifiApProfileValue = BeanUtils.getFieldValue(standard, "mWifiApProfile");
    
                if (mWifiApProfileValue != null) {
                    htcWifiConfig.SSID = (String)BeanUtils.getFieldValue(mWifiApProfileValue, "SSID");
                }
            } catch (Exception e) {
                Logger.e(tag, "" + e.getMessage(), e);
            }
            return htcWifiConfig;
        }
    
        public WifiConfiguration getWifiApConfiguration() {
            WifiConfiguration configuration = null;
            try {
                Method method = methodMap.get(METHOD_GET_WIFI_AP_CONFIG);
                configuration = (WifiConfiguration) method.invoke(mWifiManager);
                if(isHtc()){
                    configuration = getHtcWifiApConfiguration(configuration);
                }
            } catch (Exception e) {
                Logger.e(tag, e.getMessage(), e);
            }
            return configuration;
        }
    
        public boolean setWifiApConfiguration(WifiConfiguration netConfig) {
            boolean result = false;
            try {
                if (isHtc()) {
                    setupHtcWifiConfiguration(netConfig);
                }
    
                Method method = methodMap.get(getSetWifiApConfigName());
                Class<?>[] params = method.getParameterTypes();
                for (Class<?> clazz : params) {
                    Logger.i(tag, "param -> " + clazz.getSimpleName());
                }
    
                if (isHtc()) {
                    int rValue = (Integer) method.invoke(mWifiManager, netConfig);
                    Logger.i(tag, "rValue -> " + rValue);
                    result = rValue > 0;
                } else {
                    result = (Boolean) method.invoke(mWifiManager, netConfig);
                }
            } catch (Exception e) {
                Logger.e(tag, "", e);
            }
            return result;
        }
        
        public boolean setWifiApEnabled(WifiConfiguration configuration, boolean enabled) {
            boolean result = false;
            try {
                Method method = methodMap.get(METHOD_SET_WIFI_AP_ENABLED);
                result = (Boolean)method.invoke(mWifiManager, configuration, enabled);
            } catch (Exception e) {
                Logger.e(tag, e.getMessage(), e);
            }
            return result;
        }
    
        public boolean isWifiApEnabled() {
            boolean result = false;
            try {
                Method method = methodMap.get(METHOD_IS_WIFI_AP_ENABLED);
                result = (Boolean)method.invoke(mWifiManager);
            } catch (Exception e) {
                Logger.e(tag, e.getMessage(), e);
            }
            return result;
        }
    
        private void setupHtcWifiConfiguration(WifiConfiguration config) {
            try {
                Logger.d(tag, "config=  " + config);
                Object mWifiApProfileValue = BeanUtils.getFieldValue(config, "mWifiApProfile");
    
                if (mWifiApProfileValue != null) {
                    BeanUtils.setFieldValue(mWifiApProfileValue, "SSID", config.SSID);
                    BeanUtils.setFieldValue(mWifiApProfileValue, "BSSID", config.BSSID);
                    BeanUtils.setFieldValue(mWifiApProfileValue, "secureType", "open");
                    BeanUtils.setFieldValue(mWifiApProfileValue, "dhcpEnable", 1);
                }
            } catch (Exception e) {
                Logger.e(tag, "" + e.getMessage(), e);
            }
        }
        
        public static boolean isHtc() {
            return mIsHtc;
        }
        
        private static String getSetWifiApConfigName() {
            return mIsHtc? "setWifiApConfig": "setWifiApConfiguration";
        }
    }

  • 相关阅读:
    面向对象设计的原则里氏代换原则
    阅读源码的一些错误观念
    gdb的一个bug Internal error: 【pc 0xxxxxxx】 in read in psymtab, but not in symtab
    STL中mem_fun和mem_fun_ref的用法
    每天写出好代码的5个建议
    /dev/null /dev/zero/
    SQL Server 2008 对 TSQL 语言的增强
    JQuery 应用JQuery.groupTable.js(二)
    jquery 实现iframe 自适应高度
    JQuery 应用JQuery.groupTable.js
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2974697.html
Copyright © 2011-2022 走看看