您的位置:首页 > 移动开发 > Android开发

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

2017-07-17 14:08 573 查看
通过查看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;

        }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: