Android设备MTP方式连接PC增删文件无法实时更新的问题
来源:互联网 发布:controlnet软件下载 编辑:程序博客网 时间:2024/05/27 20:49
- 现象:
- 当我们将一台Android设备连接到PC,以MTP设备的方式进行读取时。
- 使用一些市面上比较流行的文件管理器,甚至是厂商自带的文件管理器,进行创建文件、文件夹、复制、粘贴、删除等操作时,PC不会对我们的修改进行同步
- 这就造成,如果我们使用手机下载的东西,可能会无法实时地将其连接电脑,复制出来进行使用。
- 比较笨的办法是可以对Android设备进行重启。
- 出现原因:
- MTP设备连接电脑的时候,PC读取的并不是MTP设备的磁盘文件数据。而是通过MTP服务进行映射出来。
- 该映射的数据源时Android的Provider中的一个media数据库:com.android.provider.media/databases/external.db
- 该数据库中有一个files表,在这个表中,所有记录都将会被MTP服务进行映射到PC的文件管理器上,同时我们在PC上做的修改,也首先对服务器中的files表进行修改,随后才会触发系统的磁盘操作。
- 由此可知,如果files表中没有的数据,则无法在MTP中得到呈现
- 问题分析:
- Android 4.4以前,我们可以使用Intent.ACTION_MEDIA_MOUNTED,让Android系统重新扫描一遍SD卡,这样PC就能同步文件管理器的操作了。
- Android 4.4以后,google可能是发现了每次调用这个intent都会重新扫描SD卡,非常耗费系统资源,所以禁止非系统应用使用这个intent了。
- 同时,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(); }
- 使用上述方法,可以指定一个文件的路径,随后系统会将这个文件进行扫描,扫描过后,PC也能同步这个文件了。
- 但是这种方案,有一个非常严重的问题:
- 如果我们扫描的是一个文件夹,系统会默认这个文件夹时一个文件,于是将其当成文件进行入库,此时就会造成一个现象:
- PC中显示该文件夹为文件,Android设备中则显示为文件夹。
这都是external.db数据库闹的鬼啊!!!!!!
- 需要解决的疑问:
- 我们不能使用scanFile()这个这个方法进行扫描文件夹了,那么该怎么做呢?
1. 使用ContentResolver可以对external数据库进行增删操作。
2. 好了,有这一步就够了。 - 如果首先将文件夹入库,随后才进行扫描各个文件是否可行
- 该方案经过测试证明可行
- 具体操作:
- 首先将所有需要数据库操作的文件、目录分别存放到两个集合中
- 在进行数据库更新时,首先将目录的集合进行数据库操作
- 目录操作完毕之后,使用scanFile进行扫描文件
- 完成工作
- 我们不能使用scanFile()这个这个方法进行扫描文件夹了,那么该怎么做呢?
- 注意事项:
- ContentResolver可以使用update()方法进行更新数据库。但是此操作进行更新数据库,不会通知MTP服务重新读取数据库中的内容。换言之,就是update方法不能保证PC同步
- 出现原因:
- MTPService中有两个方法:
void sendObjectAdded(int objectHandle);
void sendObjectRemoved(int objectHandle);
- 这两个方法的执行,会通知MTP设备,数据库进行了增删操作。唯独没有update操作。所以这就造成了update方式无效的原因。
- MTPService中有两个方法:
- 出现原因:
- 如果涉及删除数据库的工作,可以进行批处理操作,使用LIKE子句进行删除
- ContentResolver可以使用update()方法进行更新数据库。但是此操作进行更新数据库,不会通知MTP服务重新读取数据库中的内容。换言之,就是update方法不能保证PC同步
总结:手机上文件系统目录上的变更没有同步到MTP数据库里,MTP数据库内容决定手机在MTP方式连接电脑时,电脑打开时展现的数据内容。MTP数据库的更新可以在插拔USB接口更新一次,也可以在重启机子后更新一次(好像根据android版本而不一样)。
1 0
- Android设备MTP方式连接PC增删文件无法实时更新的问题
- 有关Google nexus7 连接PC后MTP无法识别的问题(系统是android 4.3)
- [Android] USB连接方式(设备文件管理 MTP 模式)下看不到文件的问题、文件内容没刷新的问题
- ubuntu MTP 设备无法连接
- 关于XP系统下nexus7 连接PC后MTP无法识别的解决方法
- android开发(20) 使用adb建立pc和android设备之间的连接。usb连接方式。
- Ubuntu(Linux)连接小米手机2(Android 4.0以上)管理文件的两种方式:MTP和WiFi FTP
- Android设备选择内置光盘 连接PC时 名称的修改方式
- 在linux下挂载android的mtp设备
- 手机连接PC端后在文件管理器内新建文件,PC端无法同步更新
- android连接mac设备无法被识别的问题
- Android【USB名称修改系列】第5项-如何修改MTP在PC设备管理器中制造商的名称
- C#连接android时,pc端检测便携设备PortableDeviceApi调用的问题
- PC与设备串口连接方式
- 将USB的默认连接方式改为MTP
- activesync无法同步,ppc无法连接电脑,手机不能同步,ppc 无法建立 PC 与设备的连接
- 移动设备连接PC共享wifi后仍无法访问PC上的Nginx服务器的问题
- android mtp模式下连接PC后只显示指定文件夹
- 64位操作系统,mysql ODBC 驱动程序和应用程序之间的体系结构不匹配
- iOS开发-底层篇-Class详解的讲解
- spring mvc 的详解
- LayoutInflater使用classloader加载xml问题
- 触摸事件和点击事件的区别
- Android设备MTP方式连接PC增删文件无法实时更新的问题
- Spring JdbcTemplate使用别名传参(NamedParameterJdbcTemplate)
- Activiti集成到spring中配置
- POJ 3259-Wormholes(Bellman Ford或SPFA判负权值回路)
- 为Go语言GC正名-2秒到1毫秒的演变史
- Android动态加载技术 简单易懂的介绍方式
- Android SQLite 数据库DAO 基本方法
- 模板:Lucal定理
- mysql 表结构生成java实体与mybatis映射