以编程方式连接和断开Android设备

时间:2012-10-19 17:45:18

标签: android usb disconnect

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

我正在使用Galaxy Nexus。我的目标是尽可能保持一切尽可能接近库存,尽管我已经在内核中启用了详细的调试消息,并且为了查看它们已经在电话上启用了root访问权限以访问/proc/kmsg(以及shell命令{ {1}})。

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

  • dmesg
  • 混乱
  • /proc/bus/usb
  • 混乱
  • 在MTP / PTP之间进行更改(无法以编程方式进行)
  • 将Android USB小工具驱动程序放入模块< - ???

我将尝试弄清楚如何在列表中执行最后一个对象,因为我可以/dev/bus/usbrmmod在我的应用程序中生成insmod这将连接和断开手机。我不确定这个选项的可行性。

4 个答案:

答案 0 :(得分: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上重新连接

构建应用程序

  • 必须有一个有根设备
  • 只需使用SU权限进行shell调用 - “insmod module_name”。在调用rmmod之前,模块将强制设备进入枚举周期,断开连接并重新连接。

如果您有兴趣重复这些结果,请阅读此处发布的文件,随时向我发送任何问题。

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

答案 1 :(得分:0)

您可以尝试启用/停用某些安全设置,例如Settings.Secure.USB_MASS_STORAGE_ENABLEDSettings.Secure.ADB_ENABLED(取决于您所谓的“连接”!)

此代码应该有效(禁用USB大容量存储):

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

答案 2 :(得分:0)

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

答案 3 :(得分: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();