首页 > 编程知识 正文

usb连接方式一直显示反向充电,usb连接不正常无法识别

时间:2023-05-03 16:54:46 阅读:285260 作者:942

USB连接

USB相关的主要类:

frameworksbaseservicesusbjavacomandroidserverusbUsbService.java

frameworksbaseservicesusbjavacomandroidserverusbUsbDeviceManager.java


注册USB设备监听

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

publicUsbService(Context context) {

       ……

       //ALSA是AdvancedLinux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux        //操作系统上提供了音频和MIDI(MusicalInstrument 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 一部分存储空间,为防止内部存储被拷贝满而影响手机正常使用



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。