Android 7.0+ Uri转文件路径的可靠方法
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管理的文件。但是,需要注意的是,由于涉及到文件读写,务必确保处理好异常,防止数据丢失或应用崩溃。此外,如果应用需要长期访问这些文件,还需要考虑文件的清理和管理策略,以避免内存占用过多。"
2021-01-05 上传
2020-08-28 上传
2020-09-03 上传
2021-01-20 上传
2018-05-19 上传
197 浏览量
点击了解资源详情
2021-01-04 上传
weixin_38613548
- 粉丝: 4
- 资源: 934