USB连接

USB连接


USB相关的主要类:

frameworks\base\services\usb\java\com\android\server\usb\UsbService.java

frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java


注册USB设备监听

在UsbService启动流程中,已经讲到在Lifecycle的onStart()方法中new UsbService对象

publicUsbService(Context context) {

       ……

       //ALSAAdvancedLinux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux        //操作系统上提供了音频和MIDIMusicalInstrument Digital Interface,音乐设备数字化接口)       //的支持

       mAlsaManager = new UsbAlsaManager(context);

    ……

       if (newFile("/sys/class/android_usb").exists()) {

               //new UsbDeviceManager对象

        mDeviceManager = newUsbDeviceManager(context, mAlsaManager);

    }

}

 

接下来看下UsbDeviceManager的构造方法

 

publicUsbDeviceManager(Context context, UsbAlsaManager alsaManager) {

       ……

       mHandler = newUsbHandler(FgThread.get().getLooper());

       ……

}


在UsbHandler的构造方法中startObserving

 

//设置默认USB模式为chargeonly

mCurrentFunctions= SystemProperties.get(USB_CONFIG_PROPERTY,

                       UsbManager.USB_FUNCTION_NONE);


mUEventObserver.startObserving(USB_STATE_MATCH);

mUEventObserver.startObserving(ACCESSORY_START_MATCH);

mUEventObserver.startObserving(MTP_STATE_MATCH);


    /*
     * Listens for uevent messages from the kernel to monitor the USB state
     */
    private final UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());

            String state = event.get("USB_STATE");
            String accessory = event.get("ACCESSORY");
            if (state != null) {
                mHandler.updateState(state);
            } else if ("START".equals(accessory)) {
                if (DEBUG) Slog.d(TAG, "got accessory start");
                startAccessoryMode();
            }
        }
    };

USB连接流程分析

1.     UEventObserver监听到USB连接后,调用updateState

 

State的状态是CONNECTED


发送MSG_UPDATE_STATE


调用updateUsbNotification()和updateUsbStateBroadcastIfNeeded()方法

updateUsbNotification()弹出通知

2.     updateUsbStateBroadcastIfNeeded()



3.     MtpReceiver接收ACTION_USB_STATE

收到广播后调用handleUsbState()方法,启动MtpService



4.     MtpService.java -- > onStartCommand()

在onStartCommand()中会调用manageServiceLocked,

new MtpServer




当切换不同模式,PC端显示是不一样的,charge only时PC端不显示手机信息,ptp会显示内部存储,mtp则显示内部存储和外部存储信息

代码可以看出当mMtpDisabled为false时,才会触发addStorageDevicesLocked(),当charge only模式时mMtpDisabled为true(Disable 禁用)

当mPtpMode是true时,addStorageLocked只会加载内部存储

Mtp模式时,addStorageLocked则会遍历mVolumeMap

 

在addStorageLocked方法中



MtpServer相当于一个服务器

MtpStorage对应一个"存储单元"

MtpDatabase充当着数据库的功能


需要说明的一点,pc端和手机内部显示不一致,这是Google Design。会Reserve 一部分存储空间,为防止内部存储被拷贝满而影响手机正常使用



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值