android 定制mtp连接外设的设备名称

news/2025/2/21 23:33:26/

软件平台: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;
+    }
+@VisibleForNativeprivate 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显示也正常。


http://www.ppmy.cn/news/1573702.html

相关文章

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…

数据结构 堆和priority_queue

一、堆的定义 堆(heap),是⼀棵有着特殊性质的完全⼆叉树,可以⽤来实现优先级队列(priorityqueue)。 堆需要满⾜以下性质: 1. 是⼀棵完全⼆叉树; 2. 对于树中每个结点,如…

HarmonyOS NEXT网络状态监听HTTP和RCP请求网络

当我们在HarmonyOS NEXT中开发的应用,基本上都会使用网络请求,从服务端获取数据在客户端显示或者供用户交互,有时候网络发生变化时,我们需要做一些相应的操作,接下来我们一起来了解下在HarmonyOS NEXT下如何监听网络状…

Zookeeper和Kafka的依赖关系

Zookeeper 和 Kafka 是紧密相关的,它们在功能上相互协作,共同为分布式系统提供支持,以下是它们的关系具体介绍: Kafka 依赖 Zookeeper 进行元数据管理 主题信息存储:Kafka 中的主题(Topic)相关信息,如主题的名称、分区数量、副本分布等都存储在 Zookeeper 中。当 Kafk…

【Linux基础】Linux下常用的系统命令

文章目录 一、前言二、系统监控和进程管理指令2.1 ps命令2.2 top命令2.3 kill命令2.4 shutdown命令 三、文件和目录管理指令3.1 cd命令3.2 ls命令3.3 mkdir命令3.4 cat 命令3.5 cp命令3.6 mv命令3.7 rm命令3.8 chmod命令3.9 ln命令3.10 pwd命令 四、文件查找和文本处理指令4.1 …

DataWhale组队学习 ollama教程 task4

1. 环境设置 Conda 环境:用于创建和管理 Python 虚拟环境,确保依赖包的隔离和版本控制。 命令:conda create -n handlm python3.10 创建环境,conda activate handlm 激活环境。 依赖安装:安装必要的 Python 包&#…

ECharts极简入门

ECharts 是一个基于 JavaScript的开源可视化图表库,广泛应用于数据可视化的场景中,支持多种图表类型,如柱状图、折线图、饼图、散点图、雷达图等,且具有强大的自定义功能。 1. ECharts 基本使用 首先需要引入 ECharts 库&#xf…

使用 pgvector 实现 PostgreSQL 语义搜索和 RAG:完整指南

使用 pgvector 实现 PostgreSQL 语义搜索和 RAG:完整指南 1. 引言 在当今的数据驱动世界中,能够高效地搜索和检索相关信息变得越来越重要。传统的关系型数据库虽然在结构化数据管理方面表现出色,但在处理非结构化数据和语义搜索时往往力不从…