测试平台
Platform: RK3568
OS: Android 11.0
需求描述
目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显示上有所区分。
解决方案
如何区分移动硬盘和U盘,见Android usb设备的检测及区分(sata硬盘、优盘及移动硬盘).主要就是检测removeable值,为0:硬盘,为1:u盘
解决补丁如下
From 572cf35c07f68c5cb5defe40c536dd9ad1b4648e Mon Sep 17 00:00:00 2001
From: sjf <sjf@t-chip.com.cn>
Date: Sat, 20 Mar 2021 11:31:51 +0800
Subject: [PATCH] =?UTF-8?q?Android->Vold-DiskInfo:=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E7=A1=AC=E7=9B=98=E7=B1=BB=E5=9E=8B,=E5=B0=86usb=E5=AD=98?=
=?UTF-8?q?=E5=82=A8=E8=AE=BE=E5=A4=87=E5=8C=BA=E5=88=86u=E7=9B=98?=
=?UTF-8?q?=E5=92=8C=E7=A1=AC=E7=9B=98(U=E7=9B=98=E6=98=BE=E7=A4=BAusb=20d?=
=?UTF-8?q?river,usb/sata=E7=A1=AC=E7=9B=98=E6=98=BE=E7=A4=BAHardDisk)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../base/core/java/android/os/storage/DiskInfo.java | 10 ++++++++++
.../base/core/res/res/values-zh-rCN/strings.xml | 3 ++-
.../base/core/res/res/values-zh-rHK/strings.xml | 3 ++-
.../base/core/res/res/values-zh-rTW/strings.xml | 3 ++-
frameworks/base/core/res/res/values/strings.xml | 4 +++-
frameworks/base/core/res/res/values/symbols.xml | 1 +
system/vold/VolumeManager.cpp | 21 ++++++++++++++++++++-
system/vold/model/Disk.h | 1 +
8 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/frameworks/base/core/java/android/os/storage/DiskInfo.java b/frameworks/base/core/java/android/os/storage/DiskInfo.java
index b05474e..fb80849 100644
--- a/frameworks/base/core/java/android/os/storage/DiskInfo.java
+++ b/frameworks/base/core/java/android/os/storage/DiskInfo.java
@@ -51,6 +51,7 @@ public class DiskInfo implements Parcelable {
public static final int FLAG_SD = 1 << 2;
public static final int FLAG_USB = 1 << 3;
public static final int FLAG_PCIE = 1 << 6;
+ public static final int FLAG_HARDDISK = 1 << 7;
public final String id;
@UnsupportedAppUsage
@@ -119,6 +120,8 @@ public class DiskInfo implements Parcelable {
}
}else if ((flags & FLAG_PCIE) != 0) {
return res.getString(com.android.internal.R.string.storage_pcie_drive);
+ } else if ((flags & FLAG_HARDDISK) != 0) {
+ return res.getString(com.android.internal.R.string.storage_harddisk_drive);
} else {
return null;
}
@@ -132,6 +135,8 @@ public class DiskInfo implements Parcelable {
return res.getString(com.android.internal.R.string.storage_usb_drive);
} else if (isPcie()) {
return res.getString(com.android.internal.R.string.storage_pcie_drive);
+ } else if (isHardDisk()) {
+ return res.getString(com.android.internal.R.string.storage_harddisk_drive);
} else {
return null;
}
@@ -162,6 +167,11 @@ public class DiskInfo implements Parcelable {
return (flags & FLAG_PCIE) != 0;
}
+ @UnsupportedAppUsage
+ public boolean isHardDisk() {
+ return (flags & FLAG_HARDDISK) != 0;
+ }
+
@Override
public String toString() {
final CharArrayWriter writer = new CharArrayWriter();
diff --git a/frameworks/base/core/res/res/values-zh-rCN/strings.xml b/frameworks/base/core/res/res/values-zh-rCN/strings.xml
index d686fc4..aeeda2b 100644
--- a/frameworks/base/core/res/res/values-zh-rCN/strings.xml
+++ b/frameworks/base/core/res/res/values-zh-rCN/strings.xml
@@ -1513,7 +1513,8 @@
<string name="storage_usb_drive" msgid="448030813201444573">"U 盘"</string>
<string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g> U 盘"</string>
<string name="storage_usb" msgid="2391213347883616886">"USB存储器"</string>
- <string name="storage_pcie_drive">固态硬盘</string>
+ <string name="storage_pcie_drive">PCIE 固态硬盘</string>
+ <string name="storage_harddisk_drive">硬盘</string>
<string name="extract_edit_menu_button" msgid="63954536535863040">"修改"</string>
<string name="data_usage_warning_title" msgid="9034893717078325845">"数据流量警告"</string>
<string name="data_usage_warning_body" msgid="1669325367188029454">"您已使用 <xliff:g id="APP">%s</xliff:g> 的数据流量"</string>
diff --git a/frameworks/base/core/res/res/values-zh-rHK/strings.xml b/frameworks/base/core/res/res/values-zh-rHK/strings.xml
index 06afaeb..f8369ce 100644
--- a/frameworks/base/core/res/res/values-zh-rHK/strings.xml
+++ b/frameworks/base/core/res/res/values-zh-rHK/strings.xml
@@ -1513,7 +1513,8 @@
<string name="storage_usb_drive" msgid="448030813201444573">"USB 驅動器"</string>
<string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 驅動器"</string>
<string name="storage_usb" msgid="2391213347883616886">"USB 儲存裝置"</string>
- <string name="storage_pcie_drive">固態硬碟</string>
+ <string name="storage_pcie_drive">PCIE固態硬碟</string>
+ <string name="storage_harddisk_drive">硬碟</string>
<string name="extract_edit_menu_button" msgid="63954536535863040">"編輯"</string>
<string name="data_usage_warning_title" msgid="9034893717078325845">"數據用量警告"</string>
<string name="data_usage_warning_body" msgid="1669325367188029454">"您已使用 <xliff:g id="APP">%s</xliff:g> 流動數據"</string>
diff --git a/frameworks/base/core/res/res/values-zh-rTW/strings.xml b/frameworks/base/core/res/res/values-zh-rTW/strings.xml
index 96ffb33..e4fb2bf 100644
--- a/frameworks/base/core/res/res/values-zh-rTW/strings.xml
+++ b/frameworks/base/core/res/res/values-zh-rTW/strings.xml
@@ -1513,7 +1513,8 @@
<string name="storage_usb_drive" msgid="448030813201444573">"USB 隨身碟"</string>
<string name="storage_usb_drive_label" msgid="6631740655876540521">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB 隨身碟"</string>
<string name="storage_usb" msgid="2391213347883616886">"USB 儲存裝置"</string>
- <string name="storage_pcie_drive">固態硬碟</string>
+ <string name="storage_pcie_drive">PCIE 固態硬碟</string>
+ <string name="storage_harddisk_drive">硬碟</string>
<string name="extract_edit_menu_button" msgid="63954536535863040">"編輯"</string>
<string name="data_usage_warning_title" msgid="9034893717078325845">"數據用量警告"</string>
<string name="data_usage_warning_body" msgid="1669325367188029454">"你的數據用量已達 <xliff:g id="APP">%s</xliff:g>"</string>
diff --git a/frameworks/base/core/res/res/values/strings.xml b/frameworks/base/core/res/res/values/strings.xml
index c67a905..cc60ae3 100644
--- a/frameworks/base/core/res/res/values/strings.xml
+++ b/frameworks/base/core/res/res/values/strings.xml
@@ -4052,7 +4052,9 @@
<!-- Storage description for USB storage. [CHAR LIMIT=NONE] -->
<string name="storage_usb">USB storage</string>
- <string name="storage_pcie_drive">PCIE driver</string>
+ <string name="storage_pcie_drive">PCIE storage</string>
+
+ <string name="storage_harddisk_drive">HardDisk storage</string>
<!-- Button text for the edit menu in input method extract mode. [CHAR LIMIT=16] -->
<string name="extract_edit_menu_button">Edit</string>
diff --git a/frameworks/base/core/res/res/values/symbols.xml b/frameworks/base/core/res/res/values/symbols.xml
index 24d5228..7c85c80 100644
--- a/frameworks/base/core/res/res/values/symbols.xml
+++ b/frameworks/base/core/res/res/values/symbols.xml
@@ -2663,6 +2663,7 @@
<java-symbol type="string" name="storage_usb_drive_label" />
<java-symbol type="string" name="storage_usb" />
<java-symbol type="string" name="storage_pcie_drive" />
+ <java-symbol type="string" name="storage_harddisk_drive" />
<java-symbol type="drawable" name="ic_eject_24dp" />
<java-symbol type="drawable" name="ic_folder_24dp" />
diff --git a/system/vold/VolumeManager.cpp b/system/vold/VolumeManager.cpp
index d1809b4..fdf728d 100644
--- a/system/vold/VolumeManager.cpp
+++ b/system/vold/VolumeManager.cpp
@@ -36,6 +36,7 @@
#include <linux/kdev_t.h>
#include <ApexProperties.sysprop.h>
+#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include <android-base/properties.h>
@@ -72,6 +73,7 @@
#include "model/StubVolume.h"
using android::OK;
+using android::base::ReadFileToString;
using android::base::GetBoolProperty;
using android::base::StartsWith;
using android::base::StringAppendF;
@@ -236,12 +238,29 @@ void VolumeManager::handleBlockEvent(NetlinkEvent* evt) {
// devices are SD, and that everything else is USB
int flags = source->getFlags();
LOG(VERBOSE) << "handleBlockEvent with action kAdd flags" << flags;
+
if (major == kMajorBlockMmc || IsVirtioBlkDevice(major)) {
flags |= android::vold::Disk::Flags::kSd;
}else if (major == kMajorBlockPcie) {
flags |= android::vold::Disk::Flags::kPcie;
} else {
- flags |= android::vold::Disk::Flags::kUsb;
+ std::string removable_path(StringPrintf("/sys/%s", eventPath.c_str()) + "/removable");
+ //PLOG(WARNING) << "removable_path:" << removable_path;
+ std::string removable = "1";//default is usb
+ if (ReadFileToString(removable_path, &removable)) {
+ removable = android::base::Trim(removable);
+ //PLOG(WARNING) << "removable:" << removable;
+ if(strcmp(removable.c_str(), "0") == 0){
+ PLOG(WARNING) << "set Flags kHardDisk";
+ flags |= android::vold::Disk::Flags::kHardDisk;
+ }else{
+ PLOG(WARNING) << "set Flags kUsb";
+ flags |= android::vold::Disk::Flags::kUsb;
+ }
+ }else{
+ PLOG(WARNING) << "Failed to read removable,set Flags KUsb";
+ flags |= android::vold::Disk::Flags::kUsb;
+ }
}
auto disk =
diff --git a/system/vold/model/Disk.h b/system/vold/model/Disk.h
index dda4a5d..3e3e29d 100644
--- a/system/vold/model/Disk.h
+++ b/system/vold/model/Disk.h
@@ -57,6 +57,7 @@ class Disk {
* Android (e.g., ARC++). */
kStub = 1 << 5,
kPcie = 1 << 6,
+ kHardDisk = 1 << 7,
};
const std::string& getId() const { return mId; }
--
2.7.4
实现效果如图所示: