2012-03-28 16 views
7

He leído muchas preguntas aquí en SO que preguntan cómo habilitar el anclaje USB mediante programación.Android: habilite el anclaje USB mediante programación: hay una aplicación que lo hizo para 2.3

La respuesta es siempre la misma, las aplicaciones normales no pueden hacerlo, solo las aplicaciones del sistema.

Sin embargo, para 2.3 podría descargar una aplicación en el mercado que lo haría por usted.

https://play.google.com/store/apps/details?id=org.tdtran.autousbtethering

En ICS (Android 4.0.3) ya no funciona.

¿Cómo lo hicieron por 2.3? ¿Es posible también para 4.0?

+0

"La respuesta es siempre la misma, las aplicaciones normales no pueden hacerlo, solo las aplicaciones del sistema". - Más exactamente, no hay nada en el SDK de Android para administrar la conexión USB. – CommonsWare

+1

Sí, entonces, ¿cómo logró esa aplicación hacerlo? Puede que no esté en el SDK pero sin duda es posible. ¿Fue un sucio truco? ¿Un exploit? Tal vez fue parcheado en 4.0? –

Respuesta

8

utilizando el siguiente código puede habilitar el anclaje a red de USB. No probé en 4.0.

public void switchOnTethering() { 

       Object obj = getSystemService(Context.CONNECTIVITY_SERVICE); 
       for (Method m : obj.getClass().getDeclaredMethods()) { 

        if (m.getName().equals("tether")) { 
         try { 
          m.invoke(obj, "usb0"); 
         } 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(); 
         } 
        } 
       } 
     } 
+0

¿En qué dispositivo has probado esto? Mi Samsung Galaxy S II no tiene una interfaz "usb0". (Según netcfg) –

+0

es su Samsung S II tiene ICS? He probado en muchos dispositivos, excepto en ICS y por encima de su funcionamiento en todos los dispositivos. –

+1

Sí, tiene ICS. ¿Cambió esto en ICS? –

6

ICS y superiores: para ejecutar el método de reflexión, la aplicación requeriría el permiso WRITE_SECURE_SETTINGS.

Esto no está disponible a menos que el teléfono esté rooteado.

+0

Gracias, lo verificaré y le haré saber. –

+3

Ese es solo el primer problema. Luego obtendrá esto: 01-17 22: 29: 40.983: E/Tethering (2632): Intentó conectar una zona desconocida: usb0, ignorando En mi HTC Sensation, en realidad era rndis0 en lugar de usb0? – 3c71

2

ya que esta es una de las páginas más populares en los resultados de Google para este tema. Me gustaría contribuir con mi código que está verificando las interfaces disponibles. Funciona en un teléfono Gingerbread que tengo, pero no en mi Galaxy S3.

// DETECT INTERFACE NAME 
Log.i("UsbTethering","Detecting tetherable usb interface."); 
String[] available = null; 
ConnectivityManager connMgr = (ConnectivityManager)connectivityServiceObject; 
Method[] wmMethods = connMgr.getClass().getDeclaredMethods(); 
for(Method getMethod: wmMethods) 
{ 
    if(getMethod.getName().equals("getTetherableUsbRegexs")) 
    { 
     try 
     { 
      available = (String[]) getMethod.invoke(connMgr); 
      break; 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
// DETECT INTERFACE NAME 


if(available.length > 0) 
{  
    for(String interfaceName : available) 
    { 
     Log.i("UsbTethering", "Detected " + String.valueOf(available.length) + " tetherable usb interfaces."); 
     Log.i("UsbTethering", "Trying to " + desiredString + " UsbTethering on interface " + interfaceName + "..."); 
     Integer returnCode = (Integer)method.invoke(connectivityServiceObject, interfaceName); 
     if(returnCode == 0) 
     { 
      Log.i("UsbTethering", "UsbTethering " + desiredString + "d."); 
      return true; 
     } 
     else 
     { 
      Log.w("UsbTethering", "Failed to " + desiredString + "Usb Tethering. ReturnCode of method " + method.getName() + ": " + String.valueOf(returnCode)); 
     } 
    } 
} 
1

En Samsumg Galaxy Tab 2 10.1 la interfaz no se llama "usb0" sino "rndis0". Quizás sea el mismo para Galaxy SII

1

El puerto "rndis0" está habilitado dinámicamente, no disponible en la lista de interfaces de Tetherable. Se agrega cuando el usuario selecciona la opción Anclaje a red USB en el menú. Se llama a la función ConnectivityManager :: setUsbTethering (bool) cuando se selecciona la opción. Y esta llamada de función solo está permitida para aplicaciones del sistema.

Cuestiones relacionadas