Android设备MTP方式连接PC增删文件无法实时更新的问题

来源:互联网 发布:controlnet软件下载 编辑:程序博客网 时间:2024/05/27 20:49
  1. 现象:
    1. 当我们将一台Android设备连接到PC,以MTP设备的方式进行读取时。
    2. 使用一些市面上比较流行的文件管理器,甚至是厂商自带的文件管理器,进行创建文件、文件夹、复制、粘贴、删除等操作时,PC不会对我们的修改进行同步
    3. 这就造成,如果我们使用手机下载的东西,可能会无法实时地将其连接电脑,复制出来进行使用。
    4. 比较笨的办法是可以对Android设备进行重启。
  2. 出现原因:
    1. MTP设备连接电脑的时候,PC读取的并不是MTP设备的磁盘文件数据。而是通过MTP服务进行映射出来。
    2. 该映射的数据源时Android的Provider中的一个media数据库:com.android.provider.media/databases/external.db
    3. 该数据库中有一个files表,在这个表中,所有记录都将会被MTP服务进行映射到PC的文件管理器上,同时我们在PC上做的修改,也首先对服务器中的files表进行修改,随后才会触发系统的磁盘操作。
    4. 由此可知,如果files表中没有的数据,则无法在MTP中得到呈现
  3. 问题分析:
    1. Android 4.4以前,我们可以使用Intent.ACTION_MEDIA_MOUNTED,让Android系统重新扫描一遍SD卡,这样PC就能同步文件管理器的操作了。
    2. Android 4.4以后,google可能是发现了每次调用这个intent都会重新扫描SD卡,非常耗费系统资源,所以禁止非系统应用使用这个intent了。
    3. 同时,google为了解决我们这个需求,提供了一个方案:
      1.public static void scanFile(Context context, String[] paths, String[] mimeTypes, OnScanCompletedListener callback) { ClientProxy client = new ClientProxy(paths, mimeTypes, callback); MediaScannerConnection connection = new MediaScannerConnection(context, client); client.mConnection = connection; connection.connect(); }
      1. 使用上述方法,可以指定一个文件的路径,随后系统会将这个文件进行扫描,扫描过后,PC也能同步这个文件了。
      2. 但是这种方案,有一个非常严重的问题:
        1. 如果我们扫描的是一个文件夹,系统会默认这个文件夹时一个文件,于是将其当成文件进行入库,此时就会造成一个现象:
        2. PC中显示该文件夹为文件,Android设备中则显示为文件夹。
          这都是external.db数据库闹的鬼啊!!!!!!
  4. 需要解决的疑问:
    1. 我们不能使用scanFile()这个这个方法进行扫描文件夹了,那么该怎么做呢?
      1. 使用ContentResolver可以对external数据库进行增删操作。
      2. 好了,有这一步就够了。
    2. 如果首先将文件夹入库,随后才进行扫描各个文件是否可行
      1. 该方案经过测试证明可行
      2. 具体操作:
        1. 首先将所有需要数据库操作的文件、目录分别存放到两个集合中
        2. 在进行数据库更新时,首先将目录的集合进行数据库操作
        3. 目录操作完毕之后,使用scanFile进行扫描文件
        4. 完成工作
  5. 注意事项:
    1. ContentResolver可以使用update()方法进行更新数据库。但是此操作进行更新数据库,不会通知MTP服务重新读取数据库中的内容。换言之,就是update方法不能保证PC同步
      1. 出现原因:
        1. MTPService中有两个方法:
          1. void sendObjectAdded(int objectHandle);
            void sendObjectRemoved(int objectHandle);
        2. 这两个方法的执行,会通知MTP设备,数据库进行了增删操作。唯独没有update操作。所以这就造成了update方式无效的原因。
    2. 如果涉及删除数据库的工作,可以进行批处理操作,使用LIKE子句进行删除

总结:手机上文件系统目录上的变更没有同步到MTP数据库里,MTP数据库内容决定手机在MTP方式连接电脑时,电脑打开时展现的数据内容。MTP数据库的更新可以在插拔USB接口更新一次,也可以在重启机子后更新一次(好像根据android版本而不一样)。












1 0
原创粉丝点击