significado - network info android studio
Conectividad Ethernet a través de programación(Android)(dispositivo rooteado) (4)
Tengo un pequeño problema con respecto a Ethernet .
Mis tres preguntas son:
¿Podemos activar / desactivar
Ethernet
programática?¿Podemos habilitar / deshabilitar
Ethernet
programática?¿Podemos conectar mediante programación
Ethernet
?
Las preguntas anteriores se hacen con el Wifi
. Me gusta
Podemos programáticamente encender / apagar el
Wifi
.Podemos habilitar / deshabilitar
Wifi
programáticamente.Podemos conectar mediante programación
Wifi
medianteWifiManager
.
¿Android proporciona algún EthernetManager
como WifiManager
para manejar Ethernet
?
O, si esto no parece factible, entonces mi requisito original es:
Lo primero que voy a aclarar es "EL DISPOSITIVO ESTÁ ROOTADO".
¿Puedo manipular la configuración (por defecto)? Como no quiero ninguna otra opción en el Settings.apk
no sea WIFI
y Ethernet
. Debería mostrar solo Wifi
y Ethernet
. Eso es. ¿Puedo deshabilitar todas las opciones de la Configuración o puedo eliminar todas las demás opciones de la Configuración?
Funciona para 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);
La solución que presentaré aquí es un truco con reflexión y solo funciona en un sistema Android arraigado.
Su dispositivo podría tener el popular paquete android.net.ethernet. En una actividad, intente
Object emInstance = getSystemService("ethernet");
Devuelve una instancia válida de EthernetManager o null. Nulo significa que estás fuera de suerte.
Un requisito adicional puede depender de su dispositivo: Ethernet y Wifi solo pueden funcionar exclusivamente. Es posible que deba desactivar Wifi para habilitar Ethernet y viceversa.
Para habilitar Ethernet por reflexión use su instancia del EthernetManager. El método que desea invocar es setEthEnabled (booleano habilitado)
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();
}
Su manifiesto de aplicación necesita estos permisos
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
El permiso WRITE_SECURE_SETTINGS solo puede ser adquirido por las aplicaciones del sistema. La aplicación no necesita estar firmada por una clave del sistema. Puede ser cualquier signo válido (como la función normal de exportación de aplicaciones de Android). Use busybox para volver a montar la partición del sistema para el acceso de escritura y mueva su apk a la carpeta / system / app. Reinicie el dispositivo y debería funcionar.
¿Podemos conectar mediante programación Ethernet?
No hay un Punto de Acceso para conectarte como Wifi. Puede configurarlo para DHCP o proporcionar valores estáticos. Por supuesto, esto también puede hacerse a través de la reflexión. Necesitará la clase EthernetDevInfo para eso.
La implementación real de EthernetManager y EthernetDevInfo puede diferir ligeramente entre las versiones de Android y los dispositivos, ya que no tiene que cumplir con una API pública (aún) e incluso puede ser una versión personalizada. Para obtener una lista de captadores y definidores, puede utilizar un Introspector o una reflexión en general.
Ok, aquí hay algunos métodos que hice para manipular con la INTERFAZ ETHERNET (eth0).
1) Un método para verificar si existe una interfaz Ethernet
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) Un método para verificar si ETHERNET está habilitado o ENCENDIDO
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) Un método para habilitar o deshabilitar Ethernet dependiendo del estado en que se encuentre
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) Un método para conectarse a través de Ethernet dependiendo del tipo elegido (dhcp / static)
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;
}
Hay una clase más que creé para almacenar todos los valores de eth necesarios. Esta clase se inicializa con los valores que el usuario inserta.
public class StaticConnectionSettings {
private String ip, netmask, dns, mac, gateway, type;
//Getters and Setters
}
Esto es todo ... Lo probaré en breve ... Este código carece de una fase de prueba (ping). Y tal vez necesita configuración de DNS. Pero esto se puede hacer fácilmente. No lo he incluido porque creo que en nuestro dispositivo funcionará también sin la configuración de DNS.
Tres respuestas a tus preguntas anteriores:
- Sí. Podrías intentar usar
ifconfig eth0 down ; ifconfig eth0 up
ifconfig eth0 down ; ifconfig eth0 up
. Pero todavía no lo he probado por mí mismo. - Sí, pero no tienes que hacerlo. Android hace el cambio por ti. Si te conectas a WiFi, Ethernet se desactiva. Si ya está conectado a WiFi y conecta el cable Ethernet al dispositivo; solo tiene que deshabilitar WiFi (lo que sabe) y Android cambia automáticamente a Ethernet.
- No es tan fácil como puedes pensar. Tengo el mismo problema y hasta ahora solo he encontrado una solución que aún no he probado. Dado que Android se ejecuta en el kernel de Linux, podemos usar ifconfig para manipular la conexión Ethernet.
Aquí se oculta una explicación: http://elinux.org/images/9/98/Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity.pdf
Y el video de youtube de esta conferencia.
http://www.youtube.com/watch?v=LwI2NBq7BWM
Y una referencia sobre cómo usar ifconfig para Android
Android Ethernet configura IP usando dhcp
Así que si llegas a una posible solución, ¡por favor compártela! Si lo haré antes que usted lo haré certenly.