Android技术问题:如何将content://类型Uri转为File对象
content:// Uri 转 File 对象的正确方法
直接用 new File(uri.getPath()) 或者 new File(uri.toString()) 行不通,因为content:// 类型的 Uri 并非真实的文件系统路径,它是 Android 中 ContentProvider 用来标识数据资源的统一标识符,无法直接映射到本地文件。
正确的做法是通过 ContentResolver 读取 Uri 对应的数据流,将其写入本地临时文件,再获取这个临时文件的 File 对象,具体步骤和代码如下:
import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public File contentUriToFile(Context context, Uri contentUri) throws Exception { // 创建临时文件,存储在应用缓存目录,退出时自动删除 File tempFile = File.createTempFile("temp", null, context.getCacheDir()); tempFile.deleteOnExit(); // 读取 Uri 对应的数据流 InputStream inputStream = context.getContentResolver().openInputStream(contentUri); OutputStream outputStream = new FileOutputStream(tempFile); // 数据流写入临时文件 byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } // 关闭资源 inputStream.close(); outputStream.close(); return tempFile; }
注意事项:
- 若 Uri 指向外部存储文件,需提前申请读取外部存储的权限
- 临时文件默认存在缓存目录,如需持久化可修改存储路径
- 实际使用时需添加异常捕获逻辑,避免资源泄漏
内容的提问来源于stack exchange,提问作者Noel Dallas
相关产品推荐
相关产品推荐

