J'ai un petit problème concernant Ethernet .
Mes trois questions sont:
Peut-on activer/désactiver Ethernet
par programme?
Pouvons-nous activer/désactiver par programmation Ethernet
?
Pouvons-nous connecter par programmation Ethernet
?
Les questions ci-dessus sont faites avec la Wifi
. Comme
Nous pouvons par programme activer/désactiver Wifi
.
Nous pouvons activer/désactiver par programmation Wifi
par programmation.
Nous pouvons par programme Connecter Wifi
en utilisant WifiManager
.
Est-ce qu'Android fournit une EthernetManager
comme WifiManager
pour gérer Ethernet
?
Ou, si cela ne semble pas réalisable, alors mon exigence initiale est:
La première chose que je vais effacer est "DEVICE IS ROOTED".
Puis-je manipuler les paramètres (par défaut)? Par exemple, je ne veux aucune autre option dans le Settings.apk
que WIFI
et Ethernet
. Il devrait afficher uniquement Wifi
et Ethernet
. C'est tout. Puis-je désactiver toutes les options des paramètres ou puis-je supprimer toutes les autres options des paramètres?
La solution que je vais présenter ici est un hack utilisant la réflexion et ne fonctionne que sur un système Android enraciné.
Votre appareil peut avoir le populaire paquet Android.net.ethernet. Dans une activité, essayez
Object emInstance = getSystemService("ethernet");
Il retourne une instance valide de EthernetManager ou null. Null signifie que vous n'avez pas de chance.
Une exigence supplémentaire peut dépendre de votre appareil: Ethernet et Wifi peuvent uniquement fonctionner exclusivement. Vous devrez peut-être désactiver le Wi-Fi pour activer Ethernet et inversement.
Pour activer Ethernet par réflexion, utilisez votre instance de EthernetManager . La méthode que vous souhaitez appeler est setEthEnabled (boolean enabled).
Class<?> emClass = null;
try {
emClass = Class.forName("Android.net.ethernet.EthernetManager");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Object emInstance = getSystemService("ethernet");
Method methodSetEthEnabled = null;
try {
methodSetEthEnabled = emClass.getMethod("setEthEnabled", Boolean.TYPE);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
methodSetEthEnabled.setAccessible(true);
try {
// new Boolean(true) to enable, new Boolean(false) to disable
methodSetEthEnabled.invoke(emInstance, new Boolean(false));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Votre manifeste d'application a besoin de ces autorisations
<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />
L'autorisation WRITE_SECURE_SETTINGS ne peut être acquise que par les applications système. L'application n'a pas besoin d'être signée par une clé système. Il peut s'agir de n'importe quel signe valide (comme la fonction standard d'exportation Android App). Utilisez busybox pour remonter la partition système pour un accès en écriture et déplacez votre apk dans le dossier/system/app. Redémarrez l'appareil et cela devrait fonctionner.
Peut-on connecter par programme Ethernet?
Il n'y a pas de point d'accès pour vous connecter comme avec le Wifi. Vous le configurez pour DHCP ou vous fournissez des valeurs statiques. Cela peut bien entendu également être effectué via réflexion . Vous aurez besoin de la classe EthernetDevInfo pour cela.
L'implémentation réelle de EthernetManager et EthernetDevInfo peut légèrement différer entre les versions et les périphériques Android car elle n'a pas (encore) à se conformer à une API publique et peut même être une version personnalisée. vous pouvez utiliser un Introspector ou réflexion en général.
Ok voici quelques méthodes que j’ai faites pour manipuler avec l’ETHERNET INTERFACE (eth0).
1) Une méthode pour vérifier si une interface ethernet existe
public static boolean doesEthExist() {
List<String> list = getListOfNetworkInterfaces();
return list.contains("eth0");
}
public static List<String> getListOfNetworkInterfaces() {
List<String> list = new ArrayList<String>();
Enumeration<NetworkInterface> nets;
try {
nets = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
return null;
}
for (NetworkInterface netint : Collections.list(nets)) {
list.add(netint.getName());
}
return list;
}
2) Une méthode pour vérifier si ETHERNET est activé ou activé
public static boolean isEthOn() {
try {
String line;
boolean r = false;
Process p = Runtime.getRuntime().exec("netcfg");
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if(line.contains("eth0")){
if(line.contains("UP")){
r=true;
}
else{
r=false;
}
}
}
input.close();
Log.e("OLE","isEthOn: "+r);
return r;
} catch (IOException e) {
Log.e("OLE","Runtime Error: "+e.getMessage());
e.printStackTrace();
return false;
}
}
3) Une méthode pour activer ou désactiver Ethernet en fonction de l'état dans lequel il se trouve
public static void turnEthOnOrOff() {
try {
if(isEthOn()){
Runtime.getRuntime().exec("ifconfig eth0 down");
}
else{
Runtime.getRuntime().exec("ifconfig eth0 up");
}
} catch (IOException e) {
Log.e("OLE","Runtime Error: "+e.getMessage());
e.printStackTrace();
}
}
4) Une méthode de connexion via ethernet en fonction du type choisi (dhcp/statique)
private boolean connectToStaticSettingsViaIfconfig(StaticConnectionSettings scs) {
try {
if(typeChosen.equalsIgnoreCase("dhcp")){
Runtime.getRuntime().exec("ifconfig eth0 dhcp start");
}
else{
Runtime.getRuntime().exec("ifconfig eth0 "+scs.getIp()+" netmask "+scs.getNetmask()+" gw "+scs.getGateway());
}
} catch (IOException e) {
Log.e("OLE","Runtime Error: "+e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
Il existe une classe supplémentaire que j’ai créée pour stocker toutes les valeurs eth nécessaires. Cette classe est ensuite initialisée avec les valeurs que l'utilisateur insère.
public class StaticConnectionSettings {
private String ip, netmask, dns, mac, gateway, type;
//Getters and Setters
}
C'est ça ... Je vais le tester sous peu ... Ce code manque d'une phase de test (ping). Et peut-être faut-il configurer le DNS. Mais cela peut être fait facilement. Je ne l'ai pas inclus car je pense que sur notre appareil, il fonctionnera également sans le réglage DNS.
Trois réponses aux questions ci-dessus:
ifconfig eth0 down ; ifconfig eth0 up
. Mais je ne l'ai pas encore testé par moi-même.Une explication est cachée ici: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf
Et la vidéo youtube de cette conférence
http://www.youtube.com/watch?v=LwI2NBq7BWM
Et une référence sur la façon d'utiliser ifconfig pour Android
Android ethernet configurer IP en utilisant dhcp
Donc si vous parvenez à une solution possible, merci de la partager !! Si je vais le faire avant vous je certenly.
Cela fonctionne pour Android 6.0.1
Class<?> ethernetManagerClass = Class.forName("Android.net.ethernet.EthernetManager");
Method methodGetInstance = ethernetManagerClass.getMethod("getInstance");
Object ethernetManagerObject = methodGetInstance.invoke(ethernetManagerClass);
Method methodSetEthEnabled = ethernetManagerClass.getMethod("setEthernetEnabled", Boolean.TYPE);
methodSetEthEnabled.invoke(ethernetManagerObject, isEnabled);