17

我需要找到一种方法(使用 Android 应用程序)以编程方式连接和断开 Android 设备与主机的连接。

我正在使用 Galaxy Nexus。/proc/kmsg尽管我已经在内核中启用了详细的调试消息,并且为了查看它们已经启用了手机上的 root 访问权限来访问(以及 shell 命令) ,但我的目标是使所有内容尽可能接近库存dmesg

我确信有一种方法可以利用 root 访问权限来做我需要做的事情,但是我所有的尝试都导致了 nix。

  • 乱来/proc/bus/usb
  • 乱来/dev/bus/usb
  • 在 MTP/PTP 之间进行更改(无法以编程方式进行)
  • 将 Android USB 小工具驱动程序制作成一个模块 <- ???

我将尝试弄清楚如何执行列表中的最后一个对象,因为这样我就可以在我的应用程序rmmodinsmod产生结果*.ko,这将连接和断开电话。我不确定这个选项的可行性。

4

4 回答 4

1

解决方案是在接近截止日期时出现的,所以我几乎可以肯定这不是最好的做事方式,但它满足了我的要求。

构建 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

于 2014-02-13T23:56:27.693 回答
0

互联网控制.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);
        }

}

清单.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();

于 2014-01-08T15:43:29.897 回答
0

You can try to enable/disable some secured settings like Settings.Secure.USB_MASS_STORAGE_ENABLED or Settings.Secure.ADB_ENABLED (depending on what you call "connect" !)

This code should work (disabling USB mass storage):

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

于 2013-04-03T10:42:50.850 回答
0

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

于 2013-04-23T05:26:31.737 回答