android mtp模式下连接PC后只显示指定文件夹

转载请注明文章出错及作者
作者: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 =
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值