安卓系统下.srt文件对应MIME类型设置及文件筛选问题咨询
安卓筛选SRT字幕文件解决方案
问题根因
SRT格式没有IANA官方注册的标准MIME类型,因此大部分安卓系统自带的文件管理器不会把.srt后缀的文件映射到text/srt,直接设置该MIME类型自然识别不到文件;用text/plain又会匹配所有纯文本文件,无法精准过滤。
可行实现方案
方案1:适配Android 4.4+ 官方推荐的ACTION_OPEN_DOCUMENT选择器
分两步实现100%精准筛选:
- 配置Intent参数,尽可能收窄文件匹配范围
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); // 基础过滤:仅匹配文本类文件 intent.setType("text/*"); // 追加主流ROM识别的SRT相关MIME类型,覆盖更多映射规则 intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"text/plain", "text/srt", "application/x-subrip", "application/srt"}); // 限制仅选单个文件 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); startActivityForResult(intent, REQUEST_CODE_PICK_SRT);
- 选文件回调时追加后缀强校验,兜底过滤不符合要求的文件
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_PICK_SRT && data != null) { Uri selectedUri = data.getData(); if (selectedUri != null) { String fileName = getFileNameFromUri(selectedUri); // 统一转小写判断,避免大小写后缀漏判 if (fileName != null && fileName.toLowerCase().endsWith(".srt")) { // 符合要求,处理SRT文件逻辑 } else { // 提示用户请选择后缀为.srt的字幕文件 } } } } // 从Uri中获取文件名的工具方法 private String getFileNameFromUri(Uri uri) { String fileName = null; Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); fileName = cursor.getString(nameIndex); cursor.close(); } return fileName; }
方案2:适配老版本ACTION_GET_CONTENT选择器
Intent配置调整如下,其余后缀校验逻辑和方案1完全一致:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("text/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"text/plain", "text/srt", "application/x-subrip", "application/srt"}); startActivityForResult(intent, REQUEST_CODE_PICK_SRT);
注意事项
如果需要覆盖更多小众ROM的MIME映射规则,可以自行在EXTRA_MIME_TYPES数组中追加对应的自定义MIME类型,后缀强校验是必须步骤,可以保证所有场景下都能精准过滤SRT文件。
内容的提问来源于stack exchange,提问作者user16566034
相关产品推荐
相关产品推荐

