1: 盘符 和 卷标的区别

之前被这个概念迷惑了很久, 走了不少弯路。
盘符 - window下的概念。 例如 C: 盘 D: 盘, C和D 这是就是盘符。 Linux下无对应的概念。
卷标 - 例如 C 盘如果命名为系统, D盘命名为电影, 系统和电影 这才是卷标。 Linux下也有这东西, 这个属于文件系统的部分。
2: Android 下如何获取卷标
StorageVolume.java 中的 public String getUserLabel() 获取。
3: Android现在支持的情况
如果这么简单获取那就方便了, 首先  StorageVolume.java 这个类是不公开的, 获取方法可以通过反射。
其次  public String getUserLabel()  这个方法, 底层和上层根本就没调通(Android4.4的原生代码部分, 我看是调试通过了)。
1: Vold 接收到 U 盘插入事件。
执行 Volume.cpp 的 int Volume::mountVol() 方法 这里调用  int Volume::extractMetadata(const char* devicePath)方法 。
/** Use blkid to extract UUID and label from device, since it handles many* obscure edge cases around partition types and formats. Always broadcasts* updated metadata values.*/
int Volume::extractMetadata(const char* devicePath) {int res = 0;std::string cmd;cmd = BLKID_PATH;cmd += " -c /dev/null ";cmd += devicePath;FILE* fp = popen(cmd.c_str(), "r");if (!fp) {SLOGI("Failed to run %s: %s", cmd.c_str(), strerror(errno));res = -1;goto done;}char line[1024];char value[128];if (fgets(line, sizeof(line), fp) != NULL) {SLOGI("blkid identified as %s", line);char* start = strstr(line, "UUID=");if (start != NULL && sscanf(start + 5, "\"%127[^\"]\"", value) == 1) {setUuid(value);} else {setUuid(NULL);}start = strstr(line, "LABEL=");if (start != NULL && sscanf(start + 6, "\"%127[^\"]\"", value) == 1) {setUserLabel(value);} else {setUserLabel(NULL);}} else {SLOGI("blkid failed to identify %s", devicePath);res = -1;}pclose(fp);done:if (res == -1) {setUuid(NULL);setUserLabel(NULL);}return res;
}

通过代码就可以 U盘的基本信息 UUID 和 LABEL 都是通过 blkid 获取的。

4: blkid 分析
通过 static void print_tags(blkid_dev dev, char *show[], int numtag, int output) 把相关的信息进行输出。
5: blkid如何支持中文
这个就涉及到字符集相关的问题了, 说一个迷惑了我很久的字符集问题。
字符集包括unicode, gbk 以及gb2312等等,  但是utf-8, 这个东西不是字符集。这个是字符编码。
举个例子就明白啥叫字符编码了。
C中的字符串(char*)问题, 我们认为一个字符串的长度是, 读取到ASCII 0(‘/0’)的位置位置。
假设字符串 "A" 的GBK和UTF8编码都是 0x410 x00, 为啥后面多了个0x00, 这个就是字符串的结束位置。
字符A的 Unicode编码是 0x00 0x41, 如果用char*传递unicode字符串, 不知道字符串大小, 肯定是有问题的。 读到第一个0x00就结束了。
还不明白可以百度了。
对于vfat,fat32格式的U盘, 在windows下命名中文, 保存的字符编码是CP936(跟GBK差不多), 但是对于ntfs格式的u盘, 保存的方式是unicode。
这里涉及到android(linux)的编码问题, linux的默认编码是utf-8. 所以如果要正常显示, 需要在linux中合适的位置坐转码。
思路:
(只涉及中文, 韩文日文不考虑)在blkid这里把, 把编码直接从gbk转到utf8. (/external/e2fsprogs/misc/blkid.c)
特殊的ntfs获取卷标的地方, 为了上层的gbk编码兼容, 可以直接把unicode先转成gbk。(/external/e2fsprogs/lib/blkid/probe.c)
至于编码之间的转换可以参考网上的代码, 也可以使用开源的库iconv. 个人认为可以代码量比较小, 可以考虑网上的参考代码。

Android 获取U盘的卷标(支持中文卷标)相关推荐

  1. android 获取u盘名字_Android 获取U盘的卷标(支持中文卷标)

    [在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎 1: 盘符 和 卷标的区别 之 ...

  2. Android 机顶盒中获取U盘的卷标

    最近,在开发Android 机顶盒中,遇到需要打印U盘的卷标问题.通过查阅资料,记录一下学习过程. 卷标,用通俗的话来说,就是U盘的名称 如图:在windows系统中,F:为盘符 MQUDISK为U盘 ...

  3. android 获取u盘名字_android 获取U盘路径

    private static final String MOUNTS_FILE = "/proc/mounts"; public static boolean isMounted( ...

  4. php拍照从手机相册中选择,Android获取图片:拍照和从相册中选择

    概述 在Android开发中获取图片主要包括如下两种方式: 打开相机拍照 从图库中选择图片 一.打开相机拍照 打开相机拍照主要包括如下几个部分: 权限申请 打开摄像头 拍照后传回数据处理 1. 权限申 ...

  5. Linux下Wget获取云盘资源

    Linux下Wget获取云盘资源 使用linux过程中,经常使用云盘的我们往往需要下载云盘资源,但是在firefox页面下载往往已失败告终,怎么办呢?这里引入了firefox插件flashgot,通过 ...

  6. android免root读写u盘最新方法,支持安卓Q+

    android读写u盘支持安卓10以上的最新方法 本人是在写一个app需要读取u盘文件列表,网上找了好多方法,要不就是没有media权限,要不就是收不到广播,全部用不了,就这样搁置了一段时间终于又找到 ...

  7. Android 获取外接储存的设备路径(如挂载的U盘)

    前提介绍:项目中遇到这样一种情况,需要在开机和插入U盘的时候去获取U盘的路径,并读取U盘中的一个文件.其中插入U盘的时候,直接监听U盘挂载广播,可以获取U盘的路径,例如说路径A.但是开机的时候去需要找 ...

  8. 怎么设置u盘卷标linux,什么是卷标?U盘的卷标设置的操作教程

    由于现在U盘的储存空间大,又方便我们数据传输和携带,所以在Win10系统办公时经常会使用到,而用户一般会使用多个,为区别不同的U盘我们可以给U盘设置卷标,什么是卷标?其实卷标就是是一个磁盘的一个标识, ...

  9. android中通过java的反射机制获取U盘名称

    在android项目中实现Windos一样的U盘效果,需监听两个U盘的插入和拔出状态,并屏蔽本地存储,使用U盘来下载和上传文件: 在编辑代码中碰到一个问题:无法获取插入U盘的名称,于是通过java的反 ...

最新文章

  1. Windows和Linux下通用的线程接口
  2. 扩展Ext2类 Extending Ext2 Class
  3. Django生命周期与中间件
  4. ubuntu vi 按方向键出现很多字母是怎么回事?(没安装vim)
  5. [渝粤教育] 武汉理工大学 刑法 参考 资料
  6. 前端_网页编程 HTTP协议(进阶)
  7. Kafka是如何处理Netflix每天2万亿条消息的?
  8. python2020未来前景_2020年Python发展前景如何呢?
  9. Authentication for the REST APIs
  10. 子DIV块中设置margin-top时影响父DIV块位置的解决办法
  11. macOS -- 如何通过终端开启/关闭SSH
  12. 架构设计 例子和实践 系统设计说明书
  13. dreamweaver cs6 连接mysql_dreamweaver cs6连接数据库的具体流程讲述
  14. android模拟奥克斯空调红外,奥克斯空调手机遥控器
  15. 万万没想到,最简单的视频编辑软件竟然是知乎?!
  16. 深度学习图像标注软件LabelMe使用方法
  17. Access数据库文件HeroDB.MDB用什么工具可以打开呢?
  18. python剪刀石头布程序_使用Python Tkinter实现剪刀石头布小游戏功能
  19. Android Studio 简易通讯录制作 (Java)
  20. 苹果专用视频下载工具:Downie 3 for Mac

热门文章

  1. HackMyvm(二十七)Hommie,系列文章持续更新
  2. ftp服务器 文件无显示,ftp服务器 文件无显示
  3. (安装失败)显驱或Geforce Experience“拒绝访问”(解决方法,其他软件同理)
  4. QGIS基于快鸟(QuickBird)影像统计小麦种植面积
  5. 一分钟腾讯云轻量应用服务器性能评测(慎入坑)
  6. docker运行yyets_Docker 镜像配置,看这一篇足矣。
  7. GO的安装以及GoLand的配置
  8. cocos2d 开发入门
  9. MySQL实战45讲--日志和索引相关问题(15)
  10. windows11安全中心打不开或病毒与威胁防护打不开