转载请注明文章出错及作者
作者:Xandy
出处:http://blog.csdn.net/xl19862005
一、mtp概述
android在3.0以后的版本加入了mtp的支持,相对于mass storage模式,由于mtp优越性,现在几乎所有的手机连接PC后都是以mtp的方式进行文件访问。
这里简单讲述一下mtp的优点:
1、Initiator和Responder可同时对文件进行存储。相对于mass storage的模式,这种优点是显而易见的。
PC连接上responder设备之后,不是直接对设备中的存储分区进行访问,而是通过vfs的方式间接访问存储分区中的文件,这个作为Initiator端的PC设备来说,就不再需要关心要访问的responder存储分区是什么文件系统了,通过公用的vfs就可以对不同文件系统的存储设备进行读写了。
2、mtp模式下Initiator可以知道Responder所支持的媒体文件格式有哪些
3、文件访问权限可控。这点是笔者根据android下mtp的架构自加的,也正是本文所需要说的重点。
二、android mtp启动流程
这里要提到一点的是:android设备启动之后,当在MediaScannerReceiver(android_src/providers/MediaProvider/src/com/android/providers/media/MediaScannerReceiver.java)中监听到开机完成广播(android.intent.action.BOOT_COMPLETED)时,会启动MeidaScannerService,对整个设备内部的存储设备进行扫描,并将扫描到的文件存入数据库!
这里要提一个原生android系统的bug:在开机完成之后,在android设备上拍照或者截图后,将设备连接上PC,是无法找到刚拍的照片或截图图片的!这是因为MediaScannerService的启动只在BOOT_COMPLETED时scan一次,此后新增加的文件都还没有更新到数据库,需要重启系统后在PC上才能发现新增加的文件。
为了解决此bug,我在MediaScannerReceiver中增加了对USB_STATE状态广播的监听,所以每次插拔USB时都会scan一次。
而从上图可知,MtpService启动后也是需要去数据库(MtpDatabase)里拿文件的,所以可以通过修改数据库的查找规则来达到连接PC后只显示指定文件/文件夹的功能。
三、文件过滤代码修改
首先来看看MtpDatabase(android_src/frameworks/base/media/java/android/mtp/MtpDatabase.java)里关于创建数据库查询的方法:
private Cursor createObjectQuery(int storageID, int format, int parent) throws RemoteException {
String where;
String[] whereArgs;
if (storageID == 0xFFFFFFFF) {
// query all stores
if (format == 0) {
// query all formats
if (parent =