proyectos - manual programacion android
Conectar y desconectar programáticamente el dispositivo Android (4)
InternetControl.java
public class InternetControl {
public static void EnableInternet(Context context)
{
try {
Log.i("Reached Enable", "I am here");
setMobileDataEnabled(context,true);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void DisableInternet(Context context)
{
try {
Log.i("Reached Disable", "I am here");
setMobileDataEnabled(context,false);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void setMobileDataEnabled(Context context , boolean enabled) throws Exception{
final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class connClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = connClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conn);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}
}
Manifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
La función Habilitar o Deshabilitar es estática, por lo que puede llamar usando
classname.functionname();
Necesito encontrar una manera de (mediante una aplicación de Android) conectar y desconectar programáticamente un dispositivo Android de un host.
Estoy usando un Galaxy Nexus. Mi objetivo es mantener todo lo más cerca posible del stock, aunque ya he habilitado mensajes de depuración detallados en el kernel y, para verlos, he habilitado el acceso de root en el teléfono para acceder a /proc/kmsg
(y el comando de shell dmesg
) .
Estoy seguro de que hay una manera de aprovechar el acceso de root para hacer lo que tengo que hacer, pero todos mis intentos han llevado a la nix.
- Lío con
/proc/bus/usb
- Lío con
/dev/bus/usb
- Cambio entre MTP / PTP (no se puede hacer programáticamente)
- Convertir el controlador de dispositivo USB Android en un módulo <- ???
Voy a tratar de averiguar cómo hacer el último objeto en la lista, ya que entonces podría rmmod
e insmod
el *.ko
resultante en mi aplicación y eso conectaría y desconectaría el teléfono. Sin embargo, no estoy seguro de la viabilidad de esta opción.
La solución llegó cuando estaba cerca de una fecha límite, así que estoy casi seguro de que no es la mejor manera de hacer las cosas, pero cumplió con mis requisitos.
Construir kernel Modded (para permitir enganchar una función particular)
- Modifique la configuración del kernel para que sea compatible con Kprobes (configure CONFIG_KPROBES en Y)
- Eliminar la palabra clave "estática" de la definición de android_setup () (driver / usb / gadget / android.c)
- Construir ese kernel
Módulo del núcleo de compilación (que proporciona la funcionalidad real de conexión y desconexión )
- Utilice Kallsyms para extraer dinámicamente la dirección absoluta de android_setup ()
- Usando kprobes, enganche android_setup ()
- Configure dos temporizadores para ejecutar cada vez que se llame a android_setup ()
- Primer temporizador configurado en 2 segundos a partir de ahora, Segundo establecido en 2.005 segundos a partir de ahora
- Ambos temporizadores llevan un puntero a la estructura usb_gadget como sus datos
- En las funciones de devolución de llamada respectivas, llame a usb_gadget_connect () y usb_gadget_disconnect (), lo que fuerza la desconexión física seguida de la reconexión en el Samsung Galaxy Nexus
Aplicación de construcción
- Tengo que tener un dispositivo rooteado.
- Simplemente haga una llamada de shell con privilegios de SU - "insmod nombre_módulo". Hasta que llame a rmmod, el módulo forzará al dispositivo a entrar en un ciclo de enumeración, desconectando y volviendo a conectar continuamente.
Si está interesado en repetir estos resultados, lea el documento publicado aquí y no dude en enviarme cualquier pregunta.
https://docs.google.com/uc?export=download&id=0B9WchRkSOWwJbi10MGhLWUljT2s
Puede intentar habilitar / deshabilitar algunas configuraciones seguras como Settings.Secure.USB_MASS_STORAGE_ENABLED
o Settings.Secure.ADB_ENABLED
(¡dependiendo de lo que usted llama "conectar"!)
Este código debería funcionar (deshabilitar el almacenamiento masivo USB):
Settings.Secure.putInt(getContentResolver(),Settings.Secure.USB_MASS_STORAGE_ENABLED, 0);
Settings.Secure.putInt (getContentResolver (), Settings.Secure.USB_MASS_STORAGE_ENABLED, 0);