在Android 7.0及以上版本,由于引入了更好的文件安全性和隐私保护,传统的通过URI获取文件路径的方式不再适用。在这些版本中,Android系统限制了直接访问存储设备上的文件路径,而是鼓励使用ContentResolver和ContentProvider来处理文件操作。本文将详细介绍如何在Android 7.0及以上版本中将Uri转换为实际的文件路径。 我们了解问题的背景。在Android 7.0之前,开发者可以简单地使用`Uri`对象的`getPath()`方法来获取文件路径。然而,这种方法在7.0之后不再可靠,因为对于外部存储(如SD卡)中的文件,`getPath()`可能会返回无效或不完整的路径。因此,我们需要采取新的策略来处理Uri。 解决方案的关键在于使用ContentResolver和`openInputStream()`方法。以下是一个示例代码,展示了如何通过ContentResolver获取Uri表示的文件的InputStream,然后将其复制到应用内部存储,从而得到一个可读取的文件路径: ```java private static String getFilePathForN(Context context, Uri uri) { try { // 获取文件名 Cursor returnCursor = context.getContentResolver().query(uri, null, null, null, null); int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); returnCursor.moveToFirst(); String name = returnCursor.getString(nameIndex); // 创建应用内部存储的文件 File file = new File(context.getFilesDir(), name); // 打开Uri对应的InputStream InputStream inputStream = context.getContentResolver().openInputStream(uri); // 创建用于写入的FileOutputStream FileOutputStream outputStream = new FileOutputStream(file); // 复制InputStream到FileOutputStream int read; int maxBufferSize = 1 * 1024 * 1024; // 1MB缓冲区 int bytesAvailable = inputStream.available(); int bufferSize = Math.min(bytesAvailable, maxBufferSize); byte[] buffers = new byte[bufferSize]; while ((read = inputStream.read(buffers)) != -1) { outputStream.write(buffers, 0, read); } // 关闭游标、输入流和输出流 returnCursor.close(); inputStream.close(); outputStream.close(); // 返回文件路径 return file.getPath(); } catch (Exception e) { e.printStackTrace(); } return null; } ``` 这段代码首先使用`query()`方法从Uri获取文件名,然后在应用的内部存储目录创建一个同名文件。接下来,它打开Uri对应的InputStream,并使用一个循环将数据写入新创建的文件。关闭所有资源并返回新文件的路径。 为了确保兼容性,这里提供了一个名为`PathUtils`的类,其中包含了一个名为`getFilePathForN()`的方法,专门处理Android 7.0及更高版本的Uri转换。这个方法适用于不同品牌和型号的手机,因为它不依赖于特定的文件路径,而是通过ContentResolver进行操作。 总结来说,在Android 7.0及以上版本,处理Uri转换为路径时,开发者需要使用ContentResolver和输入/输出流来绕过直接访问文件路径的限制。这种做法不仅符合新的安全规范,而且可以确保在不同设备上的兼容性。通过这种方法,你可以读取、写入或处理任何由Uri表示的文件,即使它们位于外部存储上。


























- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 混合高斯模型中期望最大算法的实现方法探讨
- 关于混合高斯模型的期望最大算法的实现
- 一款强大的大模型微调数据集生成和管理工具
- 使用LLaMA-Factory微调多模态大语言模型的示例代码 Demo of Finetuning Multimodal LLM with LLaMA-Factory
- 基于大语言模型 API 的外挂知识库问答系统(含 neo4j 知识图谱实现)
- 数据库课程设计研究报告学生成绩管理系统.doc
- 信息技术课中的生活算法之一-操作教学.docx
- 简析互联网时代高职教育新发展.docx
- 试论中职教师信息化教学创新的研究.docx
- ASP企业员工管理系统的方案设计书与实现.doc
- 东莞理工学院C语言程序设计方案作业实验二.docx
- 试论工程项目管理的科学化.docx
- 基于大语言模型API(本地或商用API)的外挂知识库问答系统(附neo4j实现知识图谱)
- 用大数据思维提升职业教育学生的双创能力.docx
- PLC控制运料小车的方案设计书1.doc
- 优质模板旅游管理电子商务毕业论文答辩演讲课件ppt模板.pptx



评论0