Ä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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl die
ipAssignment
Feld war noch in der L preview (zumindest die version in grepcode), es ist nicht in der veröffentlichten version, wie Sie sehen können, in der "master" - Zweig des Quellcodes oder in der Github mirror.Sowohl die Enum-definition und Bereich sind jetzt in einem inneren Objekt des Typs
IpConfiguration
(auch neu). Das sind die Gefahren der Verwendung von reflection, um Zugriff auf undokumentierte Wasser... 🙂Jedoch, ist es einfach, den code optimieren, um es von Reflexion und legen Sie es dort:
Dieser code "Werke" (in dem Sinne, dass es nicht eine Ausnahme werfen), aber ich habe es noch nicht getestet weitere.
Sehen So konfigurieren Sie eine statische IP-Adresse, Netzmaske, gateway, DNS-programmgesteuert auf Android 5.x (Lollipop) für Wi-Fi-Verbindung für eine detailliertere Lösung.
java.lang.NoSuchFieldException: linkProperties
und ich Wette, ich werde mehr bekommen. Ich kann nicht finden, den richtigen Ersatz für das im Android L-code.LinkProperties
wurde mehr oder weniger ersetzt durchIpConfiguration
/StaticIpConfiguration
. Vielleicht könnte man dort vorbei schauen?