13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

MTP in Android详解

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

不过,在今天的智能手机领域内,Google和微软是一对冤家,为什么Android中会使用MTP呢?请看下文。

一  背景知识介绍

笔者相信《程序员》杂志的绝大多数读者或多或少都使用过MTP。因为早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Picture Transfer Protocol)进行媒体文件传输。那时,只要通过USB数据线把它们连接上Windows操作系统,就能在“我的电脑“中见到这些设备了。此后,用户可以把它们当做U盘一样使用,例如对其进行目录、文件的浏览和拷贝等操作。

既然可以通过MTP把智能设备当作U盘使用,那么它和我们常用的USB大容量存储(USB Mass Storage,简称UMS)有何不同呢?

MTP的好处还有很多,例如它可判断PC机拷贝的媒体文件是否受目标手机支持,甚至可以触发对应的转码程序将其转换成手机支持的格式。不过和UMS相比,MTP也有不足之处:

下面我们将介绍MTP协议。

1.1  MTP协议介绍

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

图1-1  Initiator和Responder图示

由图1-1可知:

注意:后文我们将统一以PC代表Initiator,Android手机代表Responder。

与很多协议一样,MTP也有自己的协议栈,如图1-2所示:

图1-2  MTP协议栈

由图1-2可知,MTP协议栈由下到上分别是:

如上文所述,MTP采用命令-应答方式来工作(Initator发送命令给Responder处理,Responser反馈处理结果),这种方式的主要特点有:

下面我们将以PC通过MTP打开一个文件为例,按顺序介绍其中涉及到几个主要MTP命令:

以上为读者描述了MTP使用的一个简单案例。至于其中的各种MTP命令,读者不妨阅读参考文献1,即《MTP Specification v1.0.pdf》。协议对各种命令都有非常精确的描述,例如表1-1,表1-2所示为GetDeviceInfo命令,返回值定义。其参数类型,传递方向都有详细解释(不得不说,和Linux比起来,微软的开发/技术文档做得相当到位)。

表1-1  GetDeviceInfo命令定义

Operation Code

0x1001

GetDeviceInfo对应命令的数字编号是0x1001

Data

DeviceInfo dataset

手机端返回的设备信息数据集

Data Direction

R->I

数据传输方向是手机到PC

ResponseCode Options

OK, Parameter_Not_Supported

手机给PC的返回值

表1-2所示为GetDeviceInfo的返回数据集的定义。

表1-2  GetDeviceInfo返回数据集的定义

Dataset field

Field order

Size (bytes)

Datatype

Comments

Standard Version

1

2

UINT16

手机对PTP协议的支持程度,以%表示,默认是100

MTP Vendor Extension ID

2

4

UINT32

手机对PTP厂商扩展协议的支持,默认是0xFFFFFFFF

MTP Version

3

2

UINT16

手机支持的MTP标准的版本,以%表示

MTP Extensions

4

Variable

String

手机支持的MTP扩展集

Functional Mode

5

2

UINT16

手机允许的模式

Operations Supported

6

Variable

Operation Code Array

在当前功能模式下,手机支持的所有操作

Event Supported

7

Variable

Event Code Array

在当前功能模式下,手机能产生的所有事件

Device Properties Supported

8

Variable

Device Property Code Array

在当前功能模式下,手机支持的所有设备属性

Capture Formats

9

Variable

Object Format Code Array

手机可以自己生成的文件格式,不包括拷贝到手机上文件格式

Playback Formats

10

Variable

Object Format Code Array

手机可以解析和理解的所有格式类型

Manufacturer

11

Variable

String

人可读的手机制造商的标识

Model

12

Variable

String

人可读的手机型号

Device Version

13

Variable

String

手机的软件或固件版本

Serial Number

14

Variable

String

能标明手机MTP功能的唯一序列号

1.2  OS对MTP的支持及认证

MTP协议既然由微软提出,理所当然,Windows对其支持自然是不遗余力。目前Windows操作系统中,MTP和多媒体框架紧密结合,并且已经成为Windows Media框架中的重要一部分。如WMP10(Windows Media Player 10)和WMP11均内置对MTP功能,其中WMP11还新增对Playlist和Album art的支持。

微软除了提出MTP协议并在Windows操作系统中提供大力支持外,它对使用MTP协议的设备也有所管理。所有标称支持MTP协议的设备,必须通过微软的测试WLK(Windows Logo Kit)。WLK测试通过的设备可以获得一个徽标。关于WLK测试的详细信息,请读者参考http://msdn.microsoft.com/zh-cn/library/windows/hardware/gg487530.aspx。从以上链接中也能下载到wpdmon,它是MTP开发中最常用的测试工具,可显示出所有PC与手机进行MTP操作时发送的命令、数据及返回值。图1-3为笔者测试某台Android手机的MTP功能时用wpdmon截获的信息示意图:

图1-3  wpdmon工具使用示意图

下面我们来看MTP在Android平台中的实现。

#p#

二  Android中的MTP

Android从3.0开始集成MTP功能,主要原因有三个:

2.1  Android中MTP的代码架构

要使用MTP功能,首先需要在设置中启用USB连接模式为MTP,如图1-4所示:

图1-4  Settings中的MTP设置

图1-4所示为参考机(Android 4.1版本)中“USB连接模式”设置。该操作实际上会触发USB驱动做相应变动。本文不拟讨论其中的过程,读者可参考手机中init.platform-name.usb.rc文件以查看Android系统中USB的模式设置。从目前市面上发布的数款Android 4.0及后续版本的机型来看,MTP/PTP大有取代UMS的趋势。

根据前文所述,Android中的MTP和已有的MediaProvider模块结合紧密,以更好体现“Media Transfer”的特性。其主要结构如图1-5所示:

图1-5  Android MTP架构图

由图1-5可知,Android MTP架构由下到上分别是:

下面我们来看MTP的工作流程。

2.2  MTP流程分析

我们先来看MTP模块启动的流程,如图1-6所示:

图1-6  MTP主要模块启动流程

由图1-6可知:

MtpServer是Android平台中MTP协议处理的核心模块,它会单独启动一个线程用于接收PC端的命令,其代码如图1-7所示:

图1-7  MtpServer run函数代码片段

由图1-7可知,MtpServer不断从文件描述符读取请求,然后调用handleRequest进行处理。***把处理结果返回给对端。

从这段代码读者可以发现,Android MTP命令层和物理层之间的耦合度较低,这样也方便将来实现MTP/IP功能。

接下来我们看看PC端发送SendObjectInfo的处理流程,如图1-8所示:

图1-8  sendObjectInfo处理流程图

由图1-8可知SendObjectInfo的处理流程大体步骤如下:

通过对SendObjectInfo描述,我们也可看出,Android充分利用了其平台本身的特性,真正将媒体传输协议和媒体文件扫描恰到好处得结合起来,从而发挥了MTP***功效。

三  总结

本文主要对Android中的MTP进行了相关介绍。虽然MTP协议由微软提供,但因为历史原因,其使用程度相当广泛,以至于Android也提供了最基本的MTP实现。

当然,如果要做到真正实用并通过微软认证,手机厂商还需要在此基础上做进一步的开发。结合笔者自己的使用经历,国外大牌手机厂商例如Sony、Samsung、Nokia等对MTP的支持相当到位。相比而言,国内手机厂商的起步稍微晚一点,需要投入更多的精力才能超越。另外,随着无线技术的普及,MTP基于IP的实现也将极大方面用户的使用。笔者在此希望大家能一起努力,早日让用户从USB数据线中解放出来。


当前文章:MTP in Android详解
转载源于:http://cdbrznjsb.com/article/cdpjdei.html

其他资讯

让你的专属顾问为你服务