设为首页 收藏本站
查看: 1096|回复: 0

[经验分享] Android Wifi Hotspot Manager Class

[复制链接]

尚未签到

发表于 2015-9-30 13:22:30 | 显示全部楼层 |阅读模式
  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";
}
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120977-1-1.html 上篇帖子: [转载]OpenWRT使用wifidog实现强制认证的WIFI热点 | 半个橙子 下篇帖子: 快速装备你的wifi破解利器 CDlinux with tools (无需U盘光盘,硬盘启动)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表