2012-03-28 9 views
7

Przeczytałem wiele pytań tutaj na SO, które pytają, jak włączyć programowo tethering USB.Android - programowo włącz tethering USB - istnieje aplikacja, która zrobiła to dla 2.3

Odpowiedź jest zawsze taka sama, zwykłe aplikacje nie mogą tego robić, tylko aplikacje systemowe.

Jednak za 2,3 można pobrać aplikację na rynku, która zrobi to za Ciebie.

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

Na ICS (Android 4.0.3) już nie działa.

Jak to zrobili dla wersji 2.3? Czy jest to możliwe również dla 4.0?

+0

"Odpowiedź jest zawsze taka sama, zwykłe aplikacje nie mogą tego robić, tylko aplikacje systemowe." - Dokładniej, w pakiecie Android SDK nie ma nic do zarządzania tetheringiem USB. – CommonsWare

+1

Tak, więc w jaki sposób udało się to aplikacji? Może nie być w SDK, ale na pewno jest to możliwe! Czy to była brudna sztuczka? Exploit? Może został poprawiony w wersji 4.0? –

Odpowiedz

8

za pomocą poniższego kodu można włączyć tethering przez USB. Testowałem w wersji 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

Na jakim urządzeniu to testowałeś? Mój Samsung Galaxy S II nie ma interfejsu "usb0". (Według netcfg) –

+0

czy twój Samsung S II ma ICS? Testowałem na wielu urządzeniach, z wyjątkiem ICS i powyżej jego działania we wszystkich urządzeniach. –

+1

Tak, ma on ICS. Czy ta zmiana w ICS? –

6

ICS i powyżej: Aby wykonać metoda refleksyjna, stosowanie wymagałoby zgody WRITE_SECURE_SETTINGS.

Ta funkcja jest niedostępna, chyba że telefon jest zrootowany.

+0

Dzięki, sprawdzisz i dasz znać. –

+3

To tylko pierwszy problem. Wtedy dostaniesz to: 01-17 22: 29: 40.983: E/Tethering (2632): Próbowałem uwiązać nieznane iface: usb0, ignorując Na moim HTC Sensation, w rzeczywistości był to rndis0 zamiast usb0 !? – 3c71

2

ponieważ jest to jedna z najpopularniejszych stron w wynikach Google dla tego tematu Chciałbym wnieść swój kod, który sprawdza dostępne interfejsy. Działa na telefonie Gingerbread, który mam, ale nie na mojej 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

Na karcie Samsumg Galaxy Tab 2 10.1 interfejs nie jest nazywany "usb0", ale "rndis0". Może to tak samo dla Galaxy SII

1

Port "rndis0" jest włączony dynamicznie, nie dostępny na liście interfejsów Tetherable. Zostaje dodany, gdy użytkownik wybierze opcję USB Tethering w menu. Po wybraniu tej opcji wywoływana jest funkcja ConnectivityManager :: setUsbTethering (bool). A to wywołanie funkcji jest dozwolone tylko w aplikacjach systemowych.

Powiązane problemy