Android6.0 usb默认MTP模式的修改方法
在6.0以前的系统 只需要修改默认的 persist.sys.usb.config 的值就可以了,
但是6.0,无论你怎能修改persist.sys.usb.config的默认值,usb默认是仅充电模式。就算你修改了设置,拔掉后再连接也是仅充电模式。
一切问题的原因都是可以再源代码里找到线索的。
源代码
packages/apps/Settings/src/com/android/settings/deviceinfo/UsbBackend.java
public UsbBackend(Context context) {
Intent intent = context.registerReceiver(null,
new IntentFilter(UsbManager.ACTION_USB_STATE));
mIsUnlocked = intent.getBooleanExtra(UsbManager.USB_DATA_UNLOCKED, false);
…………………
}
public int getUsbDataMode() {
if (!mIsUnlocked) {
return MODE_DATA_NONE;
} else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MTP)) {
return MODE_DATA_MTP;
} else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_PTP)) {
return MODE_DATA_PTP;
} else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MIDI)) {
return MODE_DATA_MIDI;
/// M: Add for Built-in CD-ROM and USB Mass Storage @{
} else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MASS_STORAGE)) {
return MODE_DATA_MASS_STORAGE;
} else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_BICR)) {
return MODE_DATA_BICR;
/// M: @}
}
return MODE_DATA_NONE; // ...
}
从上面的代码可以看到 Android 6.0 新增了一个重要的东西—-mIsUnlocked
只要 mIsUnlocked 是false 什么模式也不会起作用,这就是原因,那么mIsUnlocked的值是谁控制的呢,继续分析代码。
我们很容易就发现了原因。
frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_STATE:
mConnected = (msg.arg1 == 1);
mConfigured = (msg.arg2 == 1);
mUsbConfigured = mConfigured;
if (!mConnected) {
// When a disconnect occurs, relock access to sensitive user data
mUsbDataUnlocked = false;
} else {
mUsbDataUnlocked = true; //subingxi add 这是我加的
}
updateUsbNotification();
updateAdbNotification();
if (UsbManager.containsFunction(mCurrentFunctions,
UsbManager.USB_FUNCTION_ACCESSORY)) {
updateCurrentAccessory();
} else if (!mConnected) {
// restore defaults when USB is disconnected
setEnabledFunctions(null, false);
}
if (mBootCompleted) {
updateUsbStateBroadcast();
updateUsbFunctions();
}
// C2K-BYPASS-START
if (bEvdoDtViaSupport == true) {
if (!mConnected) {
//set bypass mode to 0
mBypass.updateBypassMode(0);
}
}
// C2K-BYPASS-END
break;
这里就很容易看到原因了,只要usb断开连接 mUsbDataUnlocked 就会变成 false,然后你只有你只有手动到通知栏里修改usb模式后,这个mUsbDataUnlocked才会变成true,我的修改很简单,usb连接上的时候就让mUsbDataUnlocked变成true,这样你设置的模式就会生效了,就这样简单。