Android MTP流程分析

问题描述:
手机端删除文件之后在PC端查看MTP内容更新但可用容量未更新。

分析:
手机端操作后,PC端不更新。问题出在手机端操作后,没有发出Event事件给MTP驱动来通知PC端更新。

想要完美解决这个bug。需要对MTK流程有一个清晰的了解。

一、MTP介绍

MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议。

根据MTP协议,MTP的使用者包括两个部分,分别是Initiator和Responder。如图1-1所示:
这里写图片描述
图1-1 Initiator和Responder图示

  1. Initiator:主要是指USB Host,例如PC机,笔记本等。协议规定所有MTP操作只能由Initator发起。
  2. Responder:一般是诸如数码相机、智能手机等存储媒体文件的设备。Responder在MTP中的作用就是处理Initator发起的请求。同时,它还会根据自身状态的变化发送Event以通知Initiator。

二、MTP体系结构

Android中MTP的体系结构如图2-1所示:
MTP结构

  1. Application层:MtpReceiver、MtpService、MediaProvider
    MtpReceiver静态注册两个广播,响应开机完成和USB状态变化广播后,启动/停止MtpService服务。
    MtpService服务用来管理MTP,启动framework的MtpServer,主要的功能:Mount/Unmount存储设备时更新MTP设备显示、添加/删除存储设备里的文件时,将本地存储内容和MTP的内容同步。
    MediaProvider是Android媒体库数据的操作者,当媒体库文件有变化时,会通知MtpServer进行相应的操作。

  2. Framework层:MtpServer、MtpDatabase、MtpStorage
    MtpServer通过JNI调用底层接口,向上层提供MTP操作接口。
    MtpDatabase对数据操作提供了接口,最终是通过MediaProvider对数据库操作(ContentProvider数据共享)。
    MtpStorage表示一个存储单元,比如:插入SD卡,就会new一个MtpStorage添加到MTP。

  3. JNI层:
  4. HAL硬件抽象层:
  5. Kernel层:

三、MTP工作流程

MTP服务启动是从MtpReceiver开始的,当Android手机和PC建立MTP连接后,USB驱动将产生USB连接消息,并最终通知UsbManager发出广播。MtpReceiver接收到广播后,启动MtpService,同时通知MediaProvider。MediaProvider会与MtpService绑定,若Android设备中的文件结构有变化,MediaProvider则会通知MtpService。MtpService启动后会创建MtpDatabase;之后,还会创建MtpServer,MtpServer会和MtpDatabase关联。然后,MtpService会遍历本地的存储设备,并建立相应的MtpStorage,并将该MtpStorage添加到MtpDatabase和MtpServer中。最后,MtpService会启动MtpServer。如图3-1所示:
这里写图片描述
图3-1

具体问题具体分析吧,分析一下“手机端删除文件之后在PC端查看MTP内容更新但可用容量未更新”的问题吧。出现该问题,是因为手机端操作文件后,没有对MTP存储单元就行更新。

MediaProvider在对数据进行操作之后,会通知MtpService去做相应的更新处理。主要包括一下操作:
mServer.sendObjectAdded(objectHandle);
mServer.sendObjectRemoved(objectHandle);
mServer.sendObjectInfoChanged(objectHandle);
mServer.sendStorageInfoChanged(storage);
这些操作都是对MTP内容进行更新的,并没有对MTP外部显示存储单元信息进行更新。我要找到对存储单元更新的接口,如下接口:
mServer.updateStorage(storage);
MtpServer对存储单元的操作有一下接口:
addStorage(MtpStorage storage);//添加存储单元
removeStorage(MtpStorage storage);//删除存储单元
updateStorage(MtpStorage storage);//更新存储单元
updateStorage就是我们需要的接口。在手机端删除大文件之后,调用该接口,就可以对存储单元进行更新了。

MTP的结构详细解析请查看一下连接:
http://www.cnblogs.com/skywang12345/p/3474206.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值