这里主要以高通MSM8953为例
–a device/qcom/msm8963_64/system.prop
++b device/qcom/msm8963_64/system.prop
#Set composition for USB
-persist.sys.usb.config=diag,serial_smd,rmnet_qti_bam,adb
+persist.sys.usb.config=mtp,adb
#Set read only default composition for USB
ro.sys.usb.default.config=diag,serial_smd,rmnet_qti_bam,adb
一般情况下,修改persist.sys.usb.config对应的参数便可以,但是Android7.1在UsbDeviceManager.java中厂商默认把MTP移除掉了,所以,就算修改了persist.sys.usb.config这个参数值,也不起作用,但是在别的平台尝试是可以的
这处修改不起作用没关系,在这里我修改了另外一处实现了此功能
–a frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java
++b frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java
第一处修改如下:
else if (!mConnected) {
// restore defaults when USB is disconnected
++ //start:add by wf 2022/08/02
– setEnabledFunctions(null, false, false);
++ // setEnabledFunctions(null, false, false);
++ //UsbManager.USB_FUNCTION_MTP就是一个string类型,直接传“mtp”也是一样的
++ setCurrentFunctions(UsbManager.USB_FUNCTION_MTP,true);
++ //end:add by wf 2022/08/02
}
第二处修改如下:
case MSG_BOOT_COMPLETED:
mBootCompleted = true;
++ //start:add by wf 2022/08/02
++ setCurrentFunctions(UsbManager.USB_FUNCTION_MTP,true);
++ //end:add by wf 2022/08/02
if (mCurrentAccessory != null) {
getCurrentSettings().accessoryAttached(mCurrentAccessory);
}
if (mDebuggingManager != null) {
mDebuggingManager.setAdbEnabled(mAdbEnabled);
}
break;
修改后直接编译出固件,直接烧录固件即可。
如果不想修改固件,也可以通过另外一种实现,写一个具有系统权限的apk,push下去。
/**
-
Created by wf on 2022/7/29 - 16:05
**/
public class Command {
private static String TAG = “UsbSetting”;/**
- @param commandData 1: “setprop persist.sys.usb.config mtp,adb” mtp模式和adb
-
2: "setprop persist.sys.usb.config none" 充电模式
*/
public static void command(String commandData) {
try {
Log.v(TAG, "Command : " + commandData);
Runtime.getRuntime().exec(commandData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
直接调用此方法,commandData参数直接传"setprop persist.sys.usb.config mtp,adb"便可
注意,此apk在清单文件的根目录下必须加上android:sharedUserId=“android.uid.system”,然后受系统权限,具体如何写一个具有系统权限的apk可以参考我其他博客。