2012-10-19 34 views
16

Potrzebuję znaleźć sposób (za pomocą aplikacji Android) programowo podłączyć i odłączyć urządzenie z systemem Android od hosta.Programowo podłącz i odłącz urządzenie z Androidem

Używam Galaxy Nexus. Moim celem jest utrzymanie wszystkiego tak blisko, jak to tylko możliwe, mimo że mam już włączone szczegółowe komunikaty debugowania w jądrze, a aby je zobaczyć, udostępniono dostęp rootowi do telefonu, aby uzyskać dostęp do /proc/kmsg (i polecenia powłoki dmesg).

Jestem pewien, że istnieje sposób na uzyskanie dostępu do roota, aby zrobić to, co muszę zrobić, ale wszystkie moje próby doprowadziły do ​​nix.

  • zadzieraj z /proc/bus/usb
  • bałagan z /dev/bus/usb
  • Zmian między MTP/PTP (w stanie to zrobić programowo)
  • Dokonywanie Android sterownik gadżetu USB do modułu < - ???

mam zamiar spróbować dowiedzieć się, jak to zrobić ostatni obiekt na liście, a następnie będę mógł rmmod i insmod otrzymany *.ko w mojej aplikacji i że będzie podłączyć i odłączyć telefon. Nie jestem jednak pewny co do wykonalności tej opcji.

+0

udało mi się dokonać android sterownik usb gadżet do modułu, to problem powstał z próby uruchomienia jądra w/out moduł do zabudowy. – RyanLeonard

+0

Używanie [strony programisty] (http://developer.android.com/guide/topics/connectivity/usb/host.html) jako przewodnika, jeśli masz otwartą i zamkniętą metodę dla swojego urządzenia, to nie może po prostu nazywasz te urządzenia "rozłączaniem" i "ponownym podłączaniem" urządzenia? Albo może nie rozumiem dokładnie tego, co próbujesz zrobić ...? – TronicZomB

+0

Jeśli PTP działa z Androidem Cant, możesz to kontrolować? –

Odpowiedz

1

Rozwiązanie przyszło kiedy blisko terminu , więc jestem prawie pewien, że to nie jest najlepszy sposób robienia rzeczy, ale spełnił moje wymagania.

Budowa Modded kernel (aby umożliwić zahaczanie o określonej funkcji)

  • Zmienić jądra config wspierać Kprobes (zestaw CONFIG_KPROBES do Y)
  • Usuń "statyczna" słowo kluczowe z android_setup() definicji (kierowcy/usb/gadget/android.c)
  • Budowanie tego jądra

moduł jądra budowy (co daje rzeczywistą funkcjonalność podłączania i odłączania)

  • Używaj kallsyms dynamicznie wyciągnąć adres bezwzględny android_setup()
  • Używanie kprobów, haka android_setup()
  • Konfigurowanie dwóch timerów do uruchamiania za każdym razem, gdy android_setup() jest nazywane
  • najpierw ustawić czasomierz na 2 sekundy od teraz, Drugi zestaw do 2.005 sekund od teraz
  • Oba czasomierze podjąć wskaźnik do usb_gadget struct jako swoich danych
  • W odpowiednich funkcji zwrotnych, zadzwoń usb_gadget_connect() i usb_gadget_disconnect() co zmusza odłączyć fizycznej następnie ponownym połączeniu na Samsung Galaxy Nexus

budowy aplikacji

  • Muszę mieć zakorzenione URZĄDZENIE
  • Po prostu wykonaj wywołanie powłoki z uprawnieniem SU - "insmod nazwa_modułu". Dopóki nie wywołasz rmmod, moduł wymusi na urządzeniu cykl wyliczeniowy, rozłączając i ponownie łącząc się w sposób ciągły.

Jeśli są Państwo zainteresowani powtórzeniem tych wyników, prosimy przeczytać opublikowany tutaj dokument i proszę o przesłanie mi jakichkolwiek pytań.

https://docs.google.com/uc?export=download&id=0B9WchRkSOWwJbi10MGhLWUljT2s

0

Można spróbować włączyć/wyłączyć niektóre zabezpieczonych ustawień jak Settings.Secure.USB_MASS_STORAGE_ENABLED lub Settings.Secure.ADB_ENABLED

Kod ten powinien działać (wyłączenie pamięci masowej USB) (w zależności od tego, co nazywamy "connect"!):

Settings.Secure.putInt(getContentResolver(),Settings.Secure.USB_MASS_STORAGE_ENABLED, 0);

0

Ustawienia.Secure.putInt (getContentResolver(), Settings.Secure.USB_MASS_STORAGE_ENABLED, 0);

0

InternetControl.java

public class InternetControl { 
    public static void EnableInternet(Context context) 
    { 
     try { 
      Log.i("Reached Enable", "I am here"); 
      setMobileDataEnabled(context,true); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

    public static void DisableInternet(Context context) 
    { 
     try { 
      Log.i("Reached Disable", "I am here"); 
      setMobileDataEnabled(context,false); 
     } catch (Exception e) { 
    System.out.println(e.getMessage()); 
     } 
    } 

    private static void setMobileDataEnabled(Context context , boolean enabled) throws Exception{ 
      final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      final Class connClass = Class.forName(conman.getClass().getName()); 
      final Field iConnectivityManagerField = connClass.getDeclaredField("mService"); 
      iConnectivityManagerField.setAccessible(true); 
      final Object iConnectivityManager = iConnectivityManagerField.get(conn); 
      final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); 
      final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); 
      setMobileDataEnabledMethod.setAccessible(true); 
      setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled); 
     } 

} 

manifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.INTERNET" /> 

włączyć lub wyłączyć funkcję są statyczne, dzięki czemu można wywołać za pomocą
classname.functionname();