android定制mtp连接外设的设备名称
- 软件开发
- 2025-08-29 09:15:02

软件平台:Android11
硬件平台:QCS6125
需求:同一套代码基线支持多个产品型号,如S2N、S2C、E1等,但是编译的时候model属性字段在build目录就是配置好不可再更改的,如何动态的实现展示不同的mtp设备名称呢?
主要涉及两个部分的代码变更:
1、framework目录相关改动:
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 798bf6e2f8e..a63e4229317 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -665,13 +665,28 @@ public class MtpDatabase implements AutoCloseable { } } + private String getDeviceName() { + String devDefName = "S2"; + String devS2N = "S2N"; + String getName = null; + + getName = SystemProperties.get("ro.product.yfdsubmodel"); + if (null == getName) return devDefName; + + if (getName.contains("S2N")) + return devS2N; + else + return devDefName; + } + @VisibleForNative private int getDeviceProperty(int property, long[] outIntValue, char[] outStringValue) { switch (property) { case MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: case MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: // writable string properties kept in shared preferences - String value = mDeviceProperties.getString(Integer.toString(property), ""); + //String value = mDeviceProperties.getString(Integer.toString(property), ""); + String value = getDeviceName(); int length = value.length(); if (length > 255) { length = 255;上述submodel属性是系统首次启动init根据内核硬件检测初始化的boardid值去初始化的,用于区分细微硬件差别。
2、packages/services/Mtp目录改动:
diff --git a/src/com/android/mtp/MtpService.java b/src/com/android/mtp/MtpService.java index 8520b9e..1fa1aaa 100644 --- a/src/com/android/mtp/MtpService.java +++ b/src/com/android/mtp/MtpService.java @@ -32,6 +32,7 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.os.SystemProperties; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; @@ -165,6 +166,27 @@ public class MtpService extends Service { return START_REDELIVER_INTENT; } + private String getDeviceName() { + String devDefName = "S2"; + String getName = null; + + getName = SystemProperties.get("ro.product.yfdsubmodel"); + if (null == getName) return devDefName; + + if (getName.contains("S2N")) + return "S2N"; + else if (getName.contains("S2C")) + return "S2C"; + else if (getName.contains("S2A")) + return "S2A"; + else if (getName.contains("S3")) + return "S3"; + else if (getName.contains("E1")) + return "E1"; + else + return devDefName; + } + private synchronized void startServer(StorageVolume primary, String[] subdirs) { if (!(UserHandle.myUserId() == ActivityManager.getCurrentUser())) { return; @@ -200,10 +222,14 @@ public class MtpService extends Service { fd = controlFd.getFileDescriptor(); } + //final MtpServer server = + // new MtpServer(database, fd, mPtpMode, + // new OnServerTerminated(), Build.MANUFACTURER, + // Build.MODEL, "1.0"); final MtpServer server = new MtpServer(database, fd, mPtpMode, new OnServerTerminated(), Build.MANUFACTURER, - Build.MODEL, "1.0"); + getDeviceName(), "1.0"); database.setServer(server); sServerHolder = new ServerHolder(server, database);之所以需要此改动,是因为我本地一台windows一台mac,改动第一条,在win生效,但是在mac没效果,添加第二条改动后,mac显示也正常。
android定制mtp连接外设的设备名称由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“android定制mtp连接外设的设备名称”