通过Content URI获取VCF路径遇Invalid column _data错误求助
解决通过Content URI获取VCF文件路径时的
Invalid column _data错误 你遇到这个问题的核心原因很明确:你当前的代码是专门为图片文件设计的——你用了MediaStore.Images.Media.DATA这个列,但VCF(联系人名片文件)并不属于图片媒体类型,这个字段在VCF对应的Content Provider中根本不存在,所以才会抛出IllegalArgumentException。
下面给你两种可行的解决方案,优先推荐第一种(符合Android现代权限规范):
方案一:直接读取VCF内容(推荐)
从Android 10(API 29)开始,系统限制了直接访问文件路径的权限,所以最好的方式是通过ContentResolver直接打开输入流读取VCF的内容,不需要获取路径。代码如下:
fun readVcfContent(context: Context, contentUri: Uri): String? { // use函数会自动关闭流,不用手动处理 context.contentResolver.openInputStream(contentUri)?.use { inputStream -> return inputStream.bufferedReader().use { reader -> reader.readText() } } // 如果打开流失败,返回null return null }
方案二:兼容旧版本获取路径(仅Android 9及以下推荐)
如果你需要针对Android 9(API 28)及以下的设备获取文件路径,可以改用MediaStore.Files对应的字段,因为VCF文件通常会归类到通用文件中:
fun getVcfPathForLegacy(context: Context, contentUri: Uri): String? { var cursor: Cursor? = null try { // 通用文件的DATA字段 val projection = arrayOf(MediaStore.Files.FileColumns.DATA) cursor = context.contentResolver.query( contentUri, projection, null, null, null ) cursor?.takeIf { it.moveToFirst() }?.let { val columnIndex = it.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA) return it.getString(columnIndex) } } catch (e: Exception) { e.printStackTrace() } finally { cursor?.close() } return null }
重要提醒
- Android 10及以上,
MediaStore.Files.FileColumns.DATA字段已经被废弃,返回的路径是相对路径,无法直接通过File类访问,所以强烈建议使用方案一。 - 如果是通过系统文件选择器获取的VCF URI,不需要申请
READ_EXTERNAL_STORAGE权限;如果是自己扫描文件,旧版本设备需要申请该权限。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

