You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用registerForActivityResult选文件取消时空指针崩溃问题

崩溃根因
  1. ActivityResultContracts.GetContent 协议在用户主动取消文件选择时,回调返回的值为null,而非Uri.EMPTY。
  2. 你代码中将回调参数声明为不可空类型Uri,Kotlin默认会插入非空校验逻辑,收到null就会直接抛出空指针异常,和你提供的崩溃日志报错信息完全匹配。
  3. 原有逻辑只判断了uri != Uri.EMPTY,完全没有覆盖取消返回null的场景,也不支持用户取消操作。
修复代码

直接将回调参数改为可空类型Uri?,优先判空处理取消场景即可:

private val getContentCardFullImage = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    // 取消选择直接返回,不执行后续逻辑
    uri ?: return@registerForActivityResult

    val image = requireActivity().findViewById<ImageView>(R.id.iViewFullScreenImage)
    image.setImageURI(uri)

    // 注意:原有逻辑中直接用uri.path构造File的写法存在问题,Content Uri的path并非本地文件路径
    // 建议优先调整mytools.getImageFromMediaStore方法,直接传入uri参数处理,若需获取文件名可使用以下工具方法
    val fileName = getFileNameFromUri(requireContext(), uri) ?: ""
    mydecklist[cCardPosition].c_fullscreenimageuri = mytools.getImageFromMediaStore(requireContext(), fileName)

    Log.e("getContentCardFullImage", "URI = ${uri.toString()}")
}

可选补充:从Content Uri获取文件名的通用工具方法

fun getFileNameFromUri(context: Context, uri: Uri): String? {
    var fileName: String? = null
    context.contentResolver.query(uri, arrayOf(android.provider.OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor ->
        if (cursor.moveToFirst()) {
            fileName = cursor.getString(cursor.getColumnIndexOrThrow(android.provider.OpenableColumns.DISPLAY_NAME))
        }
    }
    return fileName
}
修复后效果
  • 用户按返回键取消文件选择时,不会触发崩溃,自动回到上一级页面
  • 仅在用户主动选择文件后才执行图片加载、数据保存逻辑

内容的提问来源于stack exchange,提问作者user16298059

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:39:03