外部设备挂载

注册外部设备挂载广播时必须在IntentFilter添加

filter.addDataScheme("file");

否则会收不到广播。比如广播:Intent.ACTION_MEDIA_MOUNTED

在 Android 系统中,**外部存储挂载**(External Storage Mount)通常指的是 **SD 卡** 或 **USB OTG 存储设备** 的挂载过程。这些存储设备的挂载涉及硬件识别、文件系统检测、用户权限控制以及 Android 多版本之间的兼容性处理。 --- ### 一、Android 中的外部存储分类 1. **Internal Storage(内部存储)** - 包括 `/data`、`/system` 等。 - 由系统管理,用户不可直接修改(除非 root)。 2. **Primary External Storage(主外部存储)** - 通常是内置的公共存储空间(如 `/storage/emulated/0`)。 - 可以通过 `Environment.getExternalStorageDirectory()` 获取路径。 - 在 Android 10+ 被限制访问,需使用分区权限模型(Scoped Storage)。 3. **Secondary External Storage(次级外部存储)** - 指插入的 SD 卡或 USB OTG 设备。 - 路径类似 `/storage/xxxx-xxxx`。 - 需要通过 MediaStore API 或 Storage Access Framework (SAF) 进行访问。 --- ### 二、外部存储挂载流程 #### 1. **硬件识别与驱动加载** - 当 SD 卡或 USB OTG 插入时,Linux 内核识别新块设备(如 `/dev/block/vold/179:64`)。 - Vold(Volume Daemon)监听到变化后触发后续操作。 #### 2. **Vold 执行挂载** - **Vold 是 Android 的 Volume Manager 守护进程**,负责管理外部存储设备。 - Vold 会尝试挂载设备,并根据文件系统类型(FAT32, exFAT, NTFS 等)进行适配。 - 如果是 FAT/exFAT,Android 原生支持;如果是 NTFS,则需要额外模块支持。 #### 3. **Mount Namespace 创建** - Android 使用 Linux 的 mount namespace 技术,为每个用户创建隔离的挂载视图。 - 例如:不同用户看到的是不同的 `/storage/emulated/<user_id>`。 #### 4. **SELinux 权限设置** - 挂载完成后,系统会根据 SELinux 策略设置安全上下文。 - 确保应用和用户只能访问允许的目录。 #### 5. **通知上层系统** - 挂载完成后,MediaScanner 启动扫描,索引媒体文件(图片、音乐等)。 - 用户可以通过文件管理器查看新挂载的存储。 --- ### 三、挂载后的访问方式 | 方法 | 说明 | |------|------| | **File API** | Android 10 之前可直接访问路径(如 `/storage/xxxx-xxxx`)。 | | **MediaStore API** | 推荐方式,用于查询媒体文件(图片、视频、音频)。 | | **Storage Access Framework (SAF)** | 提供用户选择文件的方式,适合文档类访问。 | --- ### 四、Android 版本对挂载的影响 | Android 版本 | 行为 | |--------------|------| | Android 10 及以上 | 引入 Scoped Storage,限制直接访问外部存储。 | | Android 11+ | 对 `MANAGE_EXTERNAL_STORAGE` 权限加强限制。 | | Android 13+ | 默认不允许 App 访问所有文件,除非有特殊权限。 | --- ### 五、示例代码(Java) ```java // 获取外部存储路径(Android 10 以下) String path = Environment.getExternalStorageDirectory().getAbsolutePath(); // 使用 MediaStore 查询图片 ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null); ``` --- ### 六、常见问题与调试 1. **无法识别 SD 卡?** - 检查 Vold 日志:`logcat -b system` - 查看是否被正确识别:`ls /dev/block/vold/*` 2. **无法写入 SD 卡?** - 检查文件系统是否只读(如 FAT32 格式)。 - 检查 SELinux 上下文是否正确。 3. **App 无法访问 SD 卡?** - Android 10+ 需要使用 MediaStore 或 SAF。 - 检查 Manifest 是否声明了 `READ_EXTERNAL_STORAGE` 或 `WRITE_EXTERNAL_STORAGE`。 --- ### 七、总结 | 步骤 | 描述 | |------|------| | 1. 硬件识别 | 插入设备后内核识别并创建块设备节点 | | 2. Vold 挂载 | Volume Daemon 挂载设备并设置路径 | | 3. SELinux 控制 | 设置安全策略限制访问 | | 4. 媒体扫描 | MediaScanner 扫描并索引文件 | | 5. 用户访问 | 通过 API 或文件管理器访问内容 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值