2011-09-22 26 views

Respuesta

3

Mirando a través de los ajustes. La documentación del sistema apunta a que la respuesta es no, no es posible hacer esto.

Link to said documentation

+0

¿No es posible, incluso por el uso de java.lang.reflection?Logré la verificación de estado de Wifi Tethering usando eso ... pero para USB no puedo entenderlo. –

7

también se puede utilizar la reflexión para acceder a la función oculta para establecer el anclaje de USB. Aquí está mi código.

ConnectivityManager cm = 
     (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    Log.d(TAG,"test enable usb tethering"); 
    String[] available = null; 
    int code=-1; 
    Method[] wmMethods = cm.getClass().getDeclaredMethods(); 

    for(Method method: wmMethods){ 
     if(method.getName().equals("getTetherableIfaces")){ 
     try { 
      available = (String[]) method.invoke(cm); 
      break; 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return; 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return; 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return; 
     } 
     } 
    } 

    for(Method method: wmMethods){ 
      if(method.getName().equals("tether")){     
       try { 
       code = (Integer) method.invoke(cm, available[0]); 


      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return; 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return; 
      } catch (InvocationTargetException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       return; 
      } 
      break; 
      } 
    } 

    if (code==0) 
     Log.d(TAG,"Enable usb tethering successfully!"); 
    else 
     Log.d(TAG,"Enable usb tethering failed!"); 

Para deshabilitar el anclaje de USB, sólo tiene que cambiar los nombres de métodos de reflexión "getTetherableIfaces" a "getTetheredIfaces", cambie "cuerda" a "untether".

Por favor, verifique.

+0

no funciona en Android 4.0 –

+0

No hace falta decirlo, pero esta es, por supuesto, una forma no estándar de hacerlo, que un desarrollador debe tener en cuenta, así que simplemente lo digo de todos modos. –

+0

no funciona en dispositivos samsung – Neji

0

He encontrado que si compruebo la interfaz de red usb0 , solo tiene una dirección IP una vez que se ha configurado el anclaje.

public static String getIPAddressUsb(final boolean useIPv4) { 
    try { 
     final List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
     for (final NetworkInterface intf : interfaces) { 
      if (intf.getDisplayName().startsWith("usb")) { 
       final List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); 
       for (final InetAddress addr : addrs) { 
        final String sAddr = addr.getHostAddress().toUpperCase(); 
        final boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
        if (useIPv4) { 
         if (isIPv4) { return sAddr; } 
        } else { 
         if (!isIPv4) { 
          final int delim = sAddr.indexOf('%'); 
          return delim < 0 ? sAddr : sAddr.substring(0, delim); 
         } 
        } 
       } 
      } 
     } 
    } catch (final Exception ex) { 
     // for now eat exceptions 
    } 
    return ""; 
} 


boolean isUsbTethered(){ 
String ipAddr = MipnAndroidApplication.getIPAddressUsb(true); 
    if (ipAddr.length() == 0) { 
     Log.i(LOG_TAG, "tethering not enabled"); 
    return false; 
    } else { 
     Log.i(LOG_TAG, "tethering enabled :)"); 
    return true; 
    } 
} 
+0

Este doent trabajo. Incluso después de saber que me he conectado y sigo corriendo sigo recibiendo el mensaje "tethering not enabled" – javawocky

1

Aquí es una solución para escuchar los cambios de estado de la inmovilización:

primer lugar usted necesita estar familiarizado con BroadcastReceiver. se puede encontrar una gran cantidad de tutorial (Google: cómo escuchar los cambios de conectividad ...)

Con el fin de obtener la actualización de estado Tethering, es necesario utilizar una acción de filtro oculta de Android (ver ConnectivityManager)

y en su clase BroadcastReceiver:

IntentFilter filter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED"); 

luego registrar el filtro para su BroadcastReceiver:

myApplicationContext.registerReceiver(this, filter); 

en su método OnReceive (contexto Contexto final, la intención Intención final), la información Intent.extras contiene 3 matrices llenas con el correspondiente interfaz de red atado: erroredArray/availableArray/activeArray

Es un poco complicado pero se puede conseguir la información de estado de tethering.

Además, se puede hacer un poco de reflexión sobre la función oculta del código de Android:

Buscar getTetherableIfaces() en el Administrador de Conectividad.

Aquí hay un enlace: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

1

Esto debería funcionar en todos los teléfonos, confirmados en algunos dispositivos Android 7,6 y 5;

Método: interfaz rndisX (normalmente rndis0) solo aparece cuando la conexión USB está habilitada.

Código Ejemplo:

private static boolean isTetheringActive(Context context){ 
    try{ 
     for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();){ 
      NetworkInterface intf=en.nextElement(); 
      for(Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();){ 
       InetAddress inetAddress=enumIpAddr.nextElement(); 
       if(!intf.isLoopback()){ 
        if(intf.getName().contains("rndis")){ 
         return true; 
        } 
       } 
      } 
     } 
    }catch(Exception e){e.printStackTrace();} 
    return false; 
} 
Cuestiones relacionadas