Android 7.0+ Uri转文件路径的可靠方法

2 下载量 184 浏览量 更新于2024-08-30 收藏 63KB PDF 举报
"Android7.0及以上版本中将Uri转换为文件路径的一种有效方法是通过ContentResolver和输入输出流操作。由于Android7.0引入了更严格的权限管理,直接获取Uri对应的绝对路径变得复杂,尤其是对于来自外部存储的文件。以下是一种经过验证的解决方案。 在Android系统中,Uri是一个用于表示数据源的抽象标识符,它并不总是指向一个具体的文件路径。尤其在Android7.0(Nougat)及以后的版本,为了保护用户隐私和安全,直接访问Uri所代表的文件路径可能会受到限制。因此,我们需要通过ContentResolver来处理Uri,以读取其内容并将其复制到我们自己的文件中,从而得到一个实际的文件路径。 以下是实现这个功能的Java代码片段: ```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); InputStream inputStream = context.getContentResolver().openInputStream(uri); FileOutputStream outputStream = new FileOutputStream(file); int read = 0; int maxBufferSize = 1 * 1024 * 1024; // 1MB作为缓冲区大小 int bytesAvailable = inputStream.available(); int bufferSize = Math.min(bytesAvailable, maxBufferSize); final byte[] buffers = new byte[bufferSize]; while ((read = inputStream.read(buffers)) != -1) { outputStream.write(buffers, 0, read); } returnCursor.close(); inputStream.close(); outputStream.close(); return file.getAbsolutePath(); // 返回复制后文件的路径 } catch (IOException e) { // 处理异常,例如文件读写错误 e.printStackTrace(); return null; } } ``` 这段代码首先使用`query()`方法从Uri获取一个Cursor,然后从中提取文件的显示名称。接着,创建一个新的File对象,用于保存Uri内容的副本。使用`openInputStream()`打开Uri对应的输入流,并通过`FileOutputStream`将内容写入新的文件。最后,返回新文件的绝对路径。 这种方法的优点是可以处理各种类型的Uri,包括那些指向外部存储或由MediaStore管理的文件。但是,需要注意的是,由于涉及到文件读写,务必确保处理好异常,防止数据丢失或应用崩溃。此外,如果应用需要长期访问这些文件,还需要考虑文件的清理和管理策略,以避免内存占用过多。"
2016-10-17 上传