2012-03-28 2 views
7

Ich habe viele Fragen hier auf SO gelesen, die fragen, wie man USB-Tethering programmgesteuert aktiviert.Android - USB-Tethering programmgesteuert aktivieren - es gibt eine App, die es für 2.3 gemacht hat

Die Antwort ist immer die gleiche, normale Anwendungen können es nicht tun, nur System-Apps.

Noch für 2.3 können Sie eine App auf dem Markt herunterladen, die es für Sie tun würde.

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

auf ICS (Android 4.0.3) ist es nicht mehr funktioniert.

Wie haben sie es für 2.3 gemacht? Ist das auch für 4.0 möglich?

+0

"Die Antwort ist immer die gleiche, normale Anwendungen können es nicht tun, nur System-Apps." - Genau genommen gibt es im Android SDK nichts, um USB-Tethering zu verwalten. – CommonsWare

+1

Ja, also wie hat es die App geschafft? Es ist möglicherweise nicht im SDK, aber es ist sicherlich möglich! War es ein schmutziger Trick? Ein Exploit? Vielleicht wurde es in 4.0 gepatcht? –

Antwort

8

Mit dem folgenden Code können Sie USB-Tethering aktivieren. Ich habe nicht in 4.0 getestet.

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

Mit welchem ​​Gerät haben Sie das getestet? Mein Samsung Galaxy S II hat keine "usb0" -Schnittstelle. (Laut netcfg) –

+0

ist Ihr Samsung S II ICS? Ich habe in vielen Geräten getestet, außer ICS und darüber, dass es in allen Geräten funktioniert. –

+1

Ja, es hat ICS. Hat sich das bei ICS geändert? –

6

ICS und oben: die Reflexionsverfahren auszuführen, würde die Anwendung die WRITE_SECURE_SETTINGS Genehmigung erforderlich.

Dies ist nur verfügbar, wenn das Telefon gerootet ist.

+0

Danke, werde es überprüfen und lassen Sie es wissen. –

+3

Das ist nur das erste Problem. Dann bekommst du folgendes: 01-17 22: 29: 40.983: E/Tethering (2632): Versucht, eine unbekannte iface: usb0, Tethering Auf meinem HTC Sensation war es eigentlich rndis0 statt usb0 !? – 3c71

2

Da dies eine der beliebtesten Seiten in den Google-Ergebnissen zu diesem Thema ist, möchte ich meinen Code beitragen, der die verfügbaren Schnittstellen überprüft. Es funktioniert auf einem Lebkuchen-Telefon, das ich habe, aber nicht mein 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

Auf dem Samsumg Galaxy Tab 2 10.1 heißt die Schnittstelle nicht "usb0" sondern "rndis0". Vielleicht das gleiche für Galaxy SII

1

Der Port "rndis0" aktiviert ist dynamisch nicht verfügbar in der Tetherable Schnittstellen Liste. Es wird hinzugefügt, wenn der Benutzer die USB-Tethering-Option im Menü auswählt. Die Funktion ConnectivityManager :: setUsbTethering (bool) wird aufgerufen, wenn die Option ausgewählt ist. Und dieser Funktionsaufruf ist nur für Systemanwendungen zulässig.