Ändern der WLAN-Konfiguration auf Android 5 (L) programmgesteuert

Dort sind einige Probleme mit der code funktionierte auf android 4.0.2..4.4.4, aber funktioniert nicht wirklich auf Android 5 und ich weiß nicht, warum. Im Grunde, der folgende code ermöglicht es, neue WiFi-IP-Zuordnung Typ: STATISCH oder DHCP. Der code, den ich verwendet ist vollständig bedeckt in dieser Antwort: https://stackoverflow.com/a/10309323/876360

Ich werde versuchen, hier die wichtigsten pats-code mit der Ausgabe-info.

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

wo wifiConf ist

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

So WifiConfigurator.setIpAssigment() ruft die nächste code:

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

Aber für einige Grund Feld "ipAssignment" kann nicht gefunden werden:

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)

Zuerst dachte ich, google verändert das Feld name. Dann überprüfte ich die Android L preview-source code, das Feld ist da. Ich bin verwirrt, warum dies geschieht.

UPDATE

Dank Matiash für ein bisschen input, ich bin in der Lage zu aktualisieren ipAssignment geben, aber ich bin nicht in der Lage zu aktualisieren DNSes. Update DNSes die ipAssigment sollte statisch sein. Nach diese Google aufgehört LinkProperties für die statische Konfiguration, die Sie verwenden StaticIpConfiguration Klasse jetzt.

Also, was ich Tue:

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

Den nächsten sehe ich im error log:

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)

Meine Vermutung ist staticIpConfiguration nicht existiert, wenn ich es nennen. Ich habe die Initialisierung irgendwie.
Irgendwelche Ideen, wie update DNSes?

  • Nur um sicherzustellen, dass Sie sich bei der richtigen source-code, vielleicht könnten Sie versuchen, Lesen Sie alle Felder aus, die Klasse in einem quick-test und sehen, welche Felder Sie hat.
InformationsquelleAutor KennyPowers | 2014-11-30
Schreibe einen Kommentar