android通过反射获取wifi热点ap的ssid和password

通过查看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;
        }
    }

 

你可能感兴趣的:(Android)