android写入权限 MTP连接方式 对手机中的文件写入数据,进行刷新并没有作用,电脑上看不到写入的数据,为什么?

以下内容是基于MTK平台的

很多时候,手机项目开发客户都要求配置USB的默认连接方式,但是在android写入权限 6.0以及之后的版本就直接配置USB连接模式看到的USB连接模式还是仅充电,而这是google的默认设计那么对于这个问题,也看了很多网上的一些解法如:android写入权限 5.0可以直接配置默认值,6.0就不可行了另外,还有在USB連接的时候进行设置当连接之后就执行一次设置USB连接模式,将MTP设置为当前连接模式这样的做法在7.0上面也是可以的。

事实上当仅充电嘚时候,查看当前USB模式的配置就算是mtp,但是还是没有显示SD卡和内部存储器主要是一个标志的问题。

那么这里先说一下在连接USB的情况下执行一次USB连接模式的设置,这里有一位大牛的方法并且提到android写入权限 6.0以前的做法,android写入权限 6.0 USB连接模式默认选为MTP 大家去参考学习一下,那么我说一下这位大牛的改法在android写入权限 6.0和7.0上面的表现的不同一个的地方:

对于上面的解法不怎么像6.0的行为,接着我就去看了一下峩们公司以前android写入权限 6.0是怎么修改的,是直接修改了值将这个值修改后,就能显示SD卡、内部存储器了

上面的这种修改方式比较简单,茬android写入权限6.0和7.0上都是可以的但是还是有差异:

但是还是对不上公司测试提的问题,那还是需要接续修改那就仔细看看这类,再上网了解一下USB连接模式这块这一块还是很深的…,涉及硬件的都是稍微复杂一点,还要跟底层通信什么的有一点大概的了解之后,再回来解决一下这个问题那么从切换USB连接模式的上层实现,那么就是修改mUsbDataUnlocked的值应该说是适当的时候修改mUsbDataUnlocked的值,那么下面分析一下有几种情况需要改变: 
1. 手机是锁屏情况下连接USB连接模式是仅充电。 
1. 手机是解锁的情况下连接USB连接模式是MTP。 
1. 手机熄屏的情况下断开USB连接方式要更噺为仅充电。 
1. 手机解锁的情况下断开USB连接方式要更新为仅充电。

主要修改上面两个类实现以下情况:

那么这样的行为就跟android写入权限 6.0 的表现一样了,问题可以说已经解决了 
像这些修改一个默认值的问题还是比较简单的。事实上对USB完全没有接触,还是要多看有那么多巨人,就借个肩膀来站站呗就像本文一开始提到的那位大神一样,在这里表示感谢

转载请注明文章出错及作者
android写入權限在3.0以后的版本加入了mtp的支持相对于mass storage模式,由于mtp优越性现在几乎所有的手机连接PC后都是以mtp的方式进行文件访问。
这里简单讲述一下mtp嘚优点:
PC连接上responder设备之后不是直接对设备中的存储分区进行访问,而是通过vfs的方式间接访问存储分区中的文件这个作为Initiator端的PC设备来说,就不再需要关心要访问的responder存储分区是什么文件系统了通过公用的vfs就可以对不同文件系统的存储设备进行读写了。
3、文件访问权限可控这点是笔者根据android写入权限下mtp的架构自加的,也正是本文所需要说的重点
这里要提一个原生android写入权限系统的bug:在开机完成之后,在android写入權限设备上拍照或者截图后将设备连接上PC,是无法找到刚拍的照片或截图图片的!这是因为MediaScannerService的启动只在BOOT_COMPLETED时scan一次此后新增加的文件都还沒有更新到数据库,需要重启系统后在PC上才能发现新增加的文件
而从上图可知,MtpService启动后也是需要去数据库(MtpDatabase)里拿文件的所以可以通過修改数据库的查找规则来达到连接PC后只显示指定文件/文件夹的功能。

而方法query的定义如下:

 

那么可以通过增加对这个mSubDirectoriesWhere的赋值(赋以指定需偠到数据库里查询的文件夹名)就可以达到想要的文件过滤功能!
而mSubDirectoriesWhere只在MtpDatabase的构造方法里进行赋值:

本文的目的是介绍android写入权限系统ΦMTP的一些相关知识主要的内容包括:

8 // 读取文件消息 19 // 从文件中读取数据到内存中。

说明:send_file_work()的作用就是不断地将文件中的数据读取到内存中并封装到USB请求结构体req中。然后再将数据req传递到USB工作队列,USB赋值将文件内容传递给PC

至此,PC读取文件内容的流程分析完毕!

下面以"android写入權限设备中将一个文件拷贝到其他目录"来对"MTP协议中Reponser到Initiator的流程"进行说明对应的时序图如图5-01所示:

在android写入权限设备上将一个文件拷贝到其他目录。文件浏览器中会发出一个Intent事件通知MediaProvider更新数据库。MediaProvider更新了数据库之后会通知MTP进行同步处理。MediaProvider通知MTP的源码如下:

说明:该函数会通知MtpServiceandroid写入权限设备中新建了个文件。

说明:该函数会调研JNI本地方法

说明:该函数会将消息发送给MtpServer。

说明:sendEvent()的作用我们前面已经介绍过叻。它在此处的目的就是通过ioctl将消息发送给Kernel。

8 // 将“用户空间”传来的值(value)拷贝到“内核空间”的event中
5 // 将“用户空间”传来的“消息的内容(event->data)”拷贝到“内核空间”中

说明:mtp_send_event()会先将"用户空间"传递来的消息的具体内容拷贝到"内核空间",并将该消息封装在一个USB请求对象req中;然后将USB請求添加到USB队列中。USB驱动负责将该数据通过USB线发送给PC

至此,android写入权限设备中将一个文件拷贝到其他目录的流程分析完毕!

我要回帖

更多关于 android写入权限 的文章

 

随机推荐