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

猜你喜欢

转载自blog.csdn.net/LikeSidehu/article/details/75226718