Android11.0系统中添加USB otg模式切换为host

添加USB otg模式切换为host

本文描述Android11中切换USB otg模式切换为host,读取优盘中内容。

通过adb命令直接切换

1.主要是修改设备上/sys/devices/platform/fe8a0000.usb2-phy/otg_mode文件,otg切换到host后,adb无法连接,可以使用adb网络连接调试,重启过后,会恢复到默认模式。

//进入设备
adb shell
//切换为host模式
echo host > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
//切换为otg模式
echo otg > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode

自定义服务中添加切换方法

  1. 添加自定义属性,路径为 /device/rockchip/rk356x/rk356x.prop;
persist.sys.usb_otg_mode=otg
  1. ITestManager及TestManager中添加方法定义,路径为 /frameworks/base/core/com/yjz/test/api/ITestManager.aidl;
    void switchUsbOtgHostMode(int mode);

/frameworks/base/core/com/yjz/test/TestManager.java

    public void switchUsbOtgHostMode(int mode) {
    
    
        try {
    
    
            mService.switchUsbOtgHostMode(mode);
        } catch (RemoteException e) {
    
    
            e.printStackTrace();
        }
    }
  1. TestManagerService中添加方法,路径为 /frameworks/base/services/core/java/com/android/server/yjz/TestManagerService.java;
//********省略代码******

    @Override
    public void switchUsbOtgHostMode(int mode) throws RemoteException {
    
    
        Message msg = Message.obtain();
        msg.what = MSG_WHAT_SWITCH_USB_MODE;
        msg.obj = mode == 1 ? "otg" : "host";
        mHandler.sendMessage(msg);
    }

    private static final int MSG_WHAT_SWITCH_USB_MODE = 11;
    private static final String USB_OTG_MODE_KEY = "persist.sys.usb_otg_mode";

    private Handler mHandler = new Handler() {
    
    
        @Override
        public void dispatchMessage(@NonNull Message msg) {
    
    
            switch (msg.what) {
    
    
                case MSG_WHAT_SWITCH_USB_MODE:
                    String newMode = (String) msg.obj;
                    SystemProperties.set(USB_OTG_MODE_KEY, newMode);
                    boolean result = switchUsbOtgHostMode(newMode);
                    Log.d(TAG, "switch usb mode " + (result ? "success" : "fail"));
                    break;
            }
        }
    };

    //usb设备模式路径
    private static final String USB_MODE_PATH = "/sys/devices/platform/fe8a0000.usb2-phy/otg_mode";

    public boolean switchUsbOtgHostMode(String mode){
    
    
        if (null == mode || "".equals(mode)) {
    
    
            return false;
        }
        String value = Tools.readByFileRead(USB_MODE_PATH);
        if (mode.equals(value)) {
    
    
            return true;
        }
        return Tools.writeByFileWrite(USB_MODE_PATH, mode);
    }

    public void onStart() {
    
    
        //设备重启后会恢复默认值,所以自定义服务启动后根据保存的自定义属性进行设置
        switchUsbOtgHostMode(SystemProperties.get(USB_OTG_MODE_KEY));
    }

//********省略代码******

封装的jar中添加对应方法供第三方应用开发者调用

  1. 在添加 修改路径/vendor/yjz/com/yjz/sdk/SDKManager.java

//********省略代码******
    public static final int USB_MODE_OTG = 1;
    public static final int USB_MODE_HOST = 2;

    public void switchUsbOtgHostMode(int mode) {
    
    
        mTestManager.switchUsbOtgHostMode(mode);
    }

//********省略代码******

  1. 编译 mmm vendor/yjz/ 生成yjz-sdk-api.jar
  2. 应用开发时导入yjz-sdk-api.jar,并调用方法
   SDKManager manger = new SDKManager(this);
   manger.switchUsbOtgHostMode(USB_MODE_HOST);

在系统设置中添加控制开关参见其它文章自行实现

猜你喜欢

转载自blog.csdn.net/yjz_0314/article/details/135450707