已知:api34
问题:无法获取uri的绝对路径
断点uri:content://com.android.providers.media.documents/document/document%3A1000131087
代码:
```kotlin
fun uriToFile(context: Context, uri: Uri): File? {
var fileDescriptor: ParcelFileDescriptor? = null
return try {
fileDescriptor = context.contentResolver.openFileDescriptor(uri, "r") ?: return null
// 根据URI类型获取实际的文件路径
when (uri.scheme) {
"file" -> File(uri.path ?: return null)
"content" -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Android 10+ 使用MediaStore API
val projection = arrayOf(MediaStore.Files.FileColumns.DATA)
val cursor =
context.contentResolver.query(uri, projection, null, null, null)
cursor?.use {
if (cursor.moveToFirst()) {
val columnIndex =
cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)
if (columnIndex >= 0) {
val path = cursor.getString(columnIndex)
if (!path.isNullOrEmpty()) File(path) else null
} else {
null
}
} else {
null
}
}
} else {
// Android 10以下版本
val projection = arrayOf(MediaStore.Files.FileColumns.DATA)
val cursor =
context.contentResolver.query(uri, projection, null, null, null)
cursor?.use {
if (cursor.moveToFirst()) {
val columnIndex =
cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)
if (columnIndex >= 0) {
val path = cursor.getString(columnIndex)
if (!path.isNullOrEmpty()) File(path) else null
} else {
null
}
} else {
null
}
}
}
}
else -> null
}
} catch (e: Exception) {
e.printStackTrace()
null
} finally {
try {
fileDescriptor?.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
```