2012-10-19 90 views
16

我需要找到一種方法(使用Android應用程序)以編程方式將Android設備與主機連接和斷開連接。以編程方式連接和斷開Android設備

我正在使用Galaxy Nexus。我的目標是讓儘可能接近庫存的東西儘管我已經在內核中啓用了詳細的調試消息,並且爲了查看它們已經啓用了對電話的根訪問以訪問/proc/kmsg(和shell命令dmesg)。

我確定有一種方法可以利用root訪問來做我需要做的事情,但是我所有的嘗試都會導致nix。

  • /proc/bus/usb
  • 惹MTP/PTP之間/dev/bus/usb
  • 變化(無法以編程方式做)
  • 使得Android的USB小工具的驅動程序到一個模塊中< - ???

我要去揣摩如何做在名單上的最後一個對象,因爲那時我將能夠rmmodinsmod將導致我的應用程序*.ko這將連接和斷開電話。但我不確定這個選項的可行性。

+0

我能夠讓Android的USB小工具驅動成模塊,那麼問題出現的嘗試運行的內核瓦特/輸出模塊內置。 – RyanLeonard

+0

因此,使用[開發者頁面](http://developer.android.com/guide/topics/connectivity/usb/host.html)作爲指南,如果您的設備具有開放和關閉方法,則無法你只是打電話給那些「斷開」和「重新連接」你的設備?或者我可能不完全瞭解你想要做什麼......? – TronicZomB

+0

如果PTP與android無法合作,你可以用它來控制它嗎? – 2013-03-16 08:57:50

回答

1

解決方案打電話來了,當接近最後期限,所以我幾乎肯定這不是做事的最佳方式,但它符合我的要求。

構建改裝成的內核(允許特定功能的掛鉤)

  • 修改內核配置,支持Kprobes的(集CONFIG_KPROBES到Y)
  • 刪除 「靜態」 的關鍵字從android_setup()定義(司機/ USB /小工具/機器人。C)
  • 構建一個內核

構建內核模塊(這給連接和斷開

  • 使用Kallsyms動態拉android_setup()
  • 絕對地址的實際功能
  • 使用kprobes,hook android_setup()
  • 設置兩個定時器在每次調用android_setup()時執行
  • 首先定時器設定爲從現在2秒,對於2.005秒第二組從現在
  • 兩個定時器採取一個指向結構usb_gadget作爲其數據
  • 在各自的回調函數,呼叫usb_gadget_connect()和usb_gadget_disconnect(),這迫使物理斷開,然後重新連接上,三星Galaxy Nexus的

構建應用程序

  • 總得有一個根深蒂固設備
  • 只需使用SU特權進行shell調用 - 「insmod module_name」。在您調用rmmod之前,模塊會強制設備進入枚舉循環,不斷斷開連接並重新連接。

如果您有興趣重複這些結果,請閱讀此處張貼的文件,並隨時向我發送任何問題。

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

0

你可以嘗試啓用/禁用像Settings.Secure.USB_MASS_STORAGE_ENABLEDSettings.Secure.ADB_ENABLED一些安全設置

此代碼應該工作(禁用USB大容量存儲)(取決於你所說的「連接」什麼!):

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

0

Settings.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" /> 

啓用或禁用功能是靜態的,所以您可以通過使用
classname.functionname();

相關問題