簡體   English   中英

以編程方式連接和斷開Android設備

[英]Programmatically Connect and Disconnect Android Device

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

我正在使用Galaxy Nexus。 我的目標是讓所有內容盡可能接近庫存,盡管我已經在內核中啟用了詳細的調試消息,並且為了查看它們已經在手機上啟用root訪問權限來訪問/proc/kmsg (以及shell命令dmesg ) 。

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

  • /proc/bus/usb
  • /dev/bus/usb
  • 在MTP / PTP之間切換(無法以編程方式進行)
  • 將Android USB小工具驅動程序轉換為模塊< - ???

我將嘗試弄清楚如何在列表中執行最后一個對象,因為我可以在我的應用程序中rmmodinsmod生成的*.ko ,這將連接和斷開手機。 我不確定這個選項的可行性。

解決方案在接近截止日期時出現,所以我幾乎可以肯定這不是最好的做事方式,但它符合我的要求。

構建Modded內核(允許掛鈎特定功能)

  • 修改內核配置以支持Kprobes(將CONFIG_KPROBES設置為Y)
  • android_setup()定義中刪除“static”關鍵字(driver / usb / gadget / android.c)
  • 構建該內核

構建內核模塊(提供連接和斷開的實際功能

  • 使用Kallsyms動態提取android_setup()的絕對地址
  • 使用kprobes,鈎子android_setup()
  • 設置兩個定時器,每次調用android_setup()時執行
  • 第一個計時器從現在開始設置為2秒,第二個計時器從現在開始設置為2.005秒
  • 兩個計時器都將指向struct usb_gadget的指針作為它們的數據
  • 在相應的回調函數中,調用usb_gadget_connect()和usb_gadget_disconnect(),強制物理斷開,然后在Samsung Galaxy Nexus上重新連接

構建應用程序

  • 必須有一個root設備
  • 只需使用SU權限進行shell調用 - “insmod module_name”。 在調用rmmod之前,模塊將強制設備進入枚舉周期,斷開連接並重新連接。

如果您有興趣重復這些結果,請閱讀此處發布的文檔,隨時向我發送任何問題。

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

您可以嘗試啟用/禁用某些安全設置,例如Settings.Secure.USB_MASS_STORAGE_ENABLEDSettings.Secure.ADB_ENABLED (取決於您所謂的“連接”!)

此代碼應該工作(禁用USB大容量存儲):

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

Settings.Secure.putInt(getContentResolver(),Settings.Secure.USB_MASS_STORAGE_ENABLED,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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM