很多时候,手机项目开发,客户都要求配置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上面的表现的不同一个的地方:
Android版本 | 在锁屏的情况下 | 在解锁的情况下 |
---|---|---|
6.0 | 仅充电 | MTP |
7.0 | MTP | MTP |
我们的测试就提了一个不安全的bug,没有解锁就能直接访问SD卡、内部存储器的数据,这是不安全的。那好像也说得有道理,那么就改。但是这个可能又时候某些公司的客户需求。
公司6.0的解法
对于上面的解法不怎么像6.0的行为,接着我就去看了一下,我们公司以前Android 6.0是怎么修改的,是直接修改了值,将这个值修改后,就能显示SD卡、内部存储器了。
修改文件frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java。
1 | public class UsbDeviceManager { |
上面的这种修改方式比较简单,在android6.0和7.0上都是可以的,但是还是有差异:
Android版本 | 在锁屏的情况下 | 在解锁的情况下 |
---|---|---|
6.0 | 仅充电 | MTP |
7.0 | MTP | MTP |
这中修改方式的最终结果还是跟上面那位大牛的修改方式表现结果一致。那么应该说是Google在7.0上又修改了这一部分的代码,使用公司以前6.0的改法,还是不行。
现在Android 7.0的解法
但是还是对不上公司测试提的问题,那还是需要接续修改。那就仔细看看这类,再上网了解一下USB连接模式这块,这一块还是很深的…,设计硬件的,都是稍微复杂一点,还要跟底层通信什么的,有一点大概的了解之后,再回来解决一下这个问题,那么从切换USB连接模式的上层实现,那么就是修改mUsbDataUnlocked的值,应该说是适当的时候修改mUsbDataUnlocked的值,那么下面分析一下有几种情况需要改变:
- 手机是锁屏情况下连接USB,连接模式是仅充电。
- 手机是解锁的情况下连接USB,连接模式是MTP。
- 手机熄屏的情况下断开USB,连接方式要更新为仅充电。
- 手机解锁的情况下断开USB,连接方式要更新为仅充电。
应该就是这四种情况,那么主要的问题是:
- 用户解锁了,通过主测广播:Intent.ACTION_USER_PRESENT判断是否解锁后用户到前台。
- USB连接状态有对应的回调,并且这个时候更新USB连接模式。
- 熄屏了,通过注册广播Intent.ACTION_SCREEN_OFF判断,还需要注册广播Intent.ACTION_SCREEN_ON,作为屏幕状态值的切换。
在UsbService.java类中注册以上说到的广播接收者,再对UsbDeviceManager.java类中的标识进行更新。
- 修改frameworks/base/services/usb/java/com/android/server/usb/UsbService.java
1 | public class UsbService extends IUsbManager.Stub { |
- 接下来修改frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
1 | public class UsbDeviceManager { |
主要修改上面两个类,实现以下情况:
Android版本 | 在锁屏的情况下 | 在解锁的情况下 |
---|---|---|
7.0 | 仅充电 | MTP |
另外Android 7.1
只要persist.sys.usb.config这个属性的值设为mtp,后面不要加上adb那些什么的,就可以了”,说是这样。
那么这样的行为就跟Android 6.0 的表现一样了,问题可以说已经解决了。
像这些修改一个默认值的问题还是比较简单的。事实上,对USB完全没有接触,还是要多看,有那么多巨人,就借个肩膀来站站呗,就像本文一开始提到的那位大神一样,在这里表示感谢。