Cambiar la configuración de WiFi en Android 5 (L) mediante programación

Hay algunos problemas con el código que funciona en Android 4.0.2..4.4.4, pero realmente no funciona en Android 5 y no sé por qué. Básicamente, el siguiente código permite configurar el nuevo tipo de asignación de IP de WiFi: ESTÁTICA o DHCP. El código que utilicé está completamente cubierto en esta respuesta:https://stackoverflow.com/a/10309323/876360

Intentaré poner aquí las partes más importantes del código con la información de salida.

...
WifiConfigurator.setIpAssignment("STATIC", wifiConf);
...

donde wifiConf es

public static WifiConfiguration getCurrentWiFiConfiguration(Context context) {
    WifiConfiguration wifiConf = null;
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    if (networkInfo.isConnected()) {
        final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
        if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.getSSID())) {
            List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
            if(configuredNetworks != null){
                for (WifiConfiguration conf : configuredNetworks) {
                    if (conf.networkId == connectionInfo.getNetworkId()) {
                        wifiConf = conf;
                        break;
                    }
                }
            }
        }
    }
    return wifiConf;
}

EntoncesWifiConfigurator.setIpAssigment() llama al siguiente código:

public static void setIpAssignment(String assign, WifiConfiguration wifiConf)
        throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException {

    setEnumField(wifiConf, assign, "ipAssignment");
}

public static void setEnumField(Object obj, String value, String name)
        throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    Log.d("myApp", obj.getClass().toString());
    Field f = obj.getClass().getField(name);
    f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
}

Pero por alguna razón no se puede encontrar el campo "ipAssignment":

11-30 12:40:54.343    5941-5941/com.myApp D/myApp﹕ class android.net.wifi.WifiConfiguration
11-30 12:40:54.344    5941-5941/com.myApp D/myApp﹕ Can't update network configuration. java.lang.NoSuchFieldException: ipAssignment
            at java.lang.Class.getField(Class.java:1048)
            at com.myApp.WifiConfigurator.setEnumField(WifiConfigurator.java:141)
            at com.myApp.WifiConfigurator.setIpAssignment(WifiConfigurator.java:25)
            at com.myApp.WifiConfigurator.updateWifiNetwork(WifiConfigurator.java:220)
            at com.myApp.ui.MainScreen.onAsyncTaskCompleted(MainScreen.java:251)
            at com.myApp.myAPI$UpdateIPTask.onPostExecute(myAPI.java:257)
            at com.myApp.myAPI$UpdateIPTask.onPostExecute(myAPI.java:194)
            at android.os.AsyncTask.finish(AsyncTask.java:632)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Al principio, pensé que google cambió el nombre del campo. Luego revisé elCódigo fuente de vista previa de Android L, el campo está ahí. Estoy confundido por qué está sucediendo esto.

ACTUALIZAR

Gracias a Matiash por algunos aportes, puedo actualizar el tipo de ipAssignment, pero no puedo actualizar los DNS. Para actualizar DNS, el ipAssigment debe ser estático. De acuerdo aesta Google dejó de usar LinkProperties para la configuración estática, ahora usan la clase StaticIpConfiguration.

Entonces, lo que hago:

public static void setDNS(InetAddress dns1, InetAddress dns2, WifiConfiguration wifiConf)
        throws SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException,
        NoSuchFieldException, IllegalAccessException {

    Object linkProperties = null;
    ArrayList<InetAddress> mDnses;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        staticIpConf = wifiConf.getClass().getMethod("getStaticIpConfiguration").invoke(wifiConf);
        mDnses = (ArrayList<InetAddress>) getDeclaredField(staticIpConf, "dnsServers");
    }
    else{
        linkProperties = getField(wifiConf, "linkProperties");
        mDnses = (ArrayList<InetAddress>) getDeclaredField(linkProperties, "mDnses");
    }

    mDnses.clear();
    mDnses.add(dns1);
    mDnses.add(dns2);
}
public static Object getDeclaredField(Object obj, String name)
        throws SecurityException, NoSuchFieldException,
        IllegalArgumentException, IllegalAccessException {

    Field f = obj.getClass().getDeclaredField(name);
    f.setAccessible(true);
    Object out = f.get(obj);
    return out;
}

Lo siguiente que veo en el registro de errores:

12-22 09:00:49.854  25815-25815/com.myapp D/myapp﹕ Can't update network configuration. java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
            at com.myapp.WifiConfigurator.getDeclaredField(WifiConfigurator.java:245)
            at com.myapp.WifiConfigurator.setDNS(WifiConfigurator.java:78)
            at com.myapp.WifiConfigurator.updateWifiNetwork(WifiConfigurator.java:356)

Mi suposicion esstaticIpConfiguration no existe cuando lo llamo. Tengo que inicializarlo de alguna manera. ¿Alguna idea de cómo actualizar DNS?

Respuestas a la pregunta(1)

Su respuesta a la pregunta