2012-03-28 10 views
7

Ho letto molte domande qui su SO che chiedono come abilitare il tethering USB a livello di programmazione.Android - abilita il tethering USB a livello di codice - c'è un'app che lo ha fatto per 2.3

La risposta è sempre la stessa, le applicazioni ordinarie non possono farlo, solo le app di sistema.

Eppure per 2.3 è possibile scaricare un'app sul mercato che lo farebbe per voi.

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

On ICS (Android 4.0.3) non funziona più.

Come hanno fatto per 2.3? È possibile anche per 4.0?

+0

"La risposta è sempre la stessa, le normali applicazioni non possono farlo, solo le app di sistema." - Più precisamente, non c'è nulla nell'SDK Android per gestire il tethering USB. – CommonsWare

+1

Sì, quindi come ha fatto l'app a riuscirci? Potrebbe non essere nell'SDK ma è certamente possibile! Era un trucco sporco? Un exploit? Forse è stato riparato in 4.0? –

risposta

8

utilizzando il codice seguente è possibile abilitare il tethering USB. ho fatto il test in 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

Quale dispositivo hai testato? Il mio Samsung Galaxy S II non ha un'interfaccia "usb0". (Secondo netcfg) –

+0

il tuo Samsung S II ha ICS? ho provato su molti dispositivi, eccetto ICS e soprattutto lavorando su tutti i dispositivi. –

+1

Sì, ha ICS. Questo cambiamento è cambiato in ICS? –

6

ICS e oltre: per eseguire il metodo di riflessione, l'applicazione richiederebbe il permesso WRITE_SECURE_SETTINGS.

Questo non è disponibile a meno che il telefono sia rootato.

+0

Grazie, verificherà e ti faccio sapere. –

+3

Questo è solo il primo problema. Poi si aprirà questo: 01-17 22: 29: 40,983: E/Tethering (2632): Ho cercato di legare un iface sconosciuta: usb0, ignorando Sul mio HTC Sensation, in realtà è stato rndis0 invece di usb0 !? – 3c71

2

poiché questa è una delle pagine più popolari nei risultati di Google per questo argomento. Vorrei contribuire con il mio codice che controlla le interfacce disponibili. Funziona con un telefono Gingerbread che ho, ma non con il mio 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

Su Samsumg Galaxy Tab 2 10.1 l'interfaccia non si chiama "usb0", ma "rndis0". Forse è lo stesso per Galaxy SII

1

La porta "rndis0" è abilitata dinamicamente non disponibile nell'elenco delle interfacce Tetherable. Viene aggiunto quando l'utente seleziona l'opzione Tethering USB nel menu. La funzione ConnectivityManager :: setUsbTethering (bool) viene chiamata quando l'opzione è selezionata. E questa chiamata di funzione è consentita solo per le applicazioni di sistema.

Problemi correlati