通过查看android5.1的源码,其实wifi热点的ssid和password已经在WifiConfiguration的构造方法里面初始化了,但是是hide的api, 第三方开发者调不到。
/** copy constructor {@hide} */
public WifiConfiguration(WifiConfiguration source) {
if (source != null) {
networkId = source.networkId;
status = source.status;
disableReason = source.disableReason;
disableReason = source.disableReason;
SSID = source.SSID;
BSSID = source.BSSID;
FQDN = source.FQDN;
naiRealm = source.naiRealm;
preSharedKey = source.preSharedKey;
........
}
}
红色部分便是SSID和password,他的构造函数的参数是自身对象,所以只要我们初始化一个WifiConfiguration对象,再用反射就能直接获取SSID和preSharedKey.
public static WifiConfiguration getWifiConfiguration(Context context){
WifiConfiguration mWifiConfig = null;
try{
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
method.setAccessible(true);
mWifiConfig = (WifiConfiguration) method.invoke(wifiManager);
}
catch (Exception e){
e.printStackTrace();
}
return mWifiConfig;
}
/**
* @param flag 0: ssid
* 1: pwd
*/
public static String getApSSIDAndPwd(Context context, int flag) {
WifiConfiguration mWifiConfig = getWifiConfiguration(context);
String ssid = null;
String pwd = null;
if (null != mWifiConfig) {
Field[] fields = mWifiConfig.getClass().getDeclaredFields();
if (null != fields) {
for (Field field : fields){
try {
if (field.getName().equals("SSID")) {
ssid = field.get(mWifiConfig).toString();
Log.e(TAG, "AP SSI = " + ssid);
} else if (field.getName().equals("preSharedKey")) {
pwd = field.get(mWifiConfig).toString();
Log.e(TAG, "AP pwd = " + pwd);
}
}
catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "getApSSIDAndPwd()-->error:" + e);
}
}
}
}
if (null == ssid){
ssid = "Unknown";
}
if (null == pwd) {
pwd = "Unknown";
}
if (0 == flag){
return ssid;
}else {
return pwd;
}
}