2011-11-04 22 views
5

¿Puedo verificar programmaticall si el dispositivo Android tiene tethering activado?¿Hay alguna manera de verificar si el anclaje está activo?

Acabo de ver la clase WifiManager. Todos los vatraibles de WifiInfo muestran los mismos valores que si el WIFI estuviera apagado en el dispositivo.

Thnaks, saludos cordiales

+0

La funcionalidad de anclaje está en Conne clase ctivityManager, pero oculta y no en la API pública. Si tiene la intención de utilizar la "API no publicada", necesitará un JAR marco modificado o utilizar el reflejo. El método que está buscando probablemente sea String [] ConnectivityManager # getTetheredIfaces(), que devuelve las interfaces de red actualmente conectadas. – Jens

Respuesta

7

tratar de usar la reflexión, así:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
Method[] wmMethods = wifi.getClass().getDeclaredMethods(); 
for(Method method: wmMethods){ 
if(method.getName().equals("isWifiApEnabled")) { 

try { 
    method.invoke(wifi); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    e.printStackTrace(); 
} 
} 

(Devuelve un Boolean)


Como Dennis sugirió que es mejor usar esto:

final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled"); 
    method.setAccessible(true); //in the case of visibility change in future APIs 
    return (Boolean) method.invoke(manager); 

(director es el WiFiManager)

+0

¡Muchas gracias! – softwaresupply

+0

No es necesario repetir todos los métodos declarados: la clase Class tiene el método "getDeclaredMethod". Mira el código en mi respuesta. –

5

En primer lugar, es necesario obtener WifiManager:

Context context = ... 
final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

continuación:

public static boolean isSharingWiFi(final WifiManager manager) 
{ 
    try 
    { 
     final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled"); 
     method.setAccessible(true); //in the case of visibility change in future APIs 
     return (Boolean) method.invoke(manager); 
    } 
    catch (final Throwable ignored) 
    { 
    } 

    return false; 
} 

También es necesario solicitar un permiso en AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
+0

¿Cuál es el propósito de todas las finales? ¿Se requieren estos en algunos casos? – diedthreetimes

+0

@diedthreetimes: "¿Cuál es el propósito de todas las finales? ¿Se requieren en algunos casos?" - Estilo de codificación, cada uno para los suyos. Ver [debería usar final] (https://programmers.stackexchange.com/q/48413/158721) y [abuso final] (https://programmers.stackexchange.com/q/98691/158721). – Daniel

+0

Una pequeña adición: uno debería verificar si el "getSystemService" devolvió nulo. –

Cuestiones relacionadas