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";
    }
}

 

posted @ 2013-03-22 08:14  IAmAProgrammer  阅读(1949)  评论(0编辑  收藏  举报