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

Kotlin使用Volley上传图片时onActivityResult废弃与registerForActivityResult报错求助

Volley图片上传废弃API问题修复方案

修复思路

  • 把registerForActivityResult的实例化逻辑从launchGallery方法中移出,改为Fragment类的全局成员变量,满足官方要求的「Fragment初始化阶段/onAttach/onCreate中调用」的规则
  • 移除已废弃的onActivityResult重写方法,将图片选中后的逻辑迁移到Activity Result的回调中
  • 调整launchGallery仅负责启动相册选择,无需重复初始化回调

修正后完整代码

// 1. 将resultLauncher提到类成员位置,Fragment初始化阶段就创建
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        val uri = data?.data
        uri?.let {
            imageView.setImageURI(it)
            createImageData(it)
        }
    }
}

//Uploading Photos
private fun launchGallery() {
    val intent = Intent(Intent.ACTION_PICK)
    intent.type = "image/*"
    // 2. 直接调用launch触发相册选择,不需要再初始化resultLauncher
    resultLauncher.launch(intent)
}

private fun uploadImage() {
    imageData?: return
    val request = object : VolleyFileUploadRequest(
        Request.Method.POST,
        postURL,
        {
            println("response is: $it")
        },
        {
            println("error is: $it")
        }
    ) {
        override fun getByteData(): MutableMap<String, FileDataPart> {
            var params = HashMap<String, FileDataPart>()
            params["imageFile"] = FileDataPart("image", imageData!!, "jpeg")
            return params
        }
    }
    Volley.newRequestQueue(requireContext()).add(request)
}

@Throws(IOException::class)
private fun createImageData(uri: Uri) {
    val inputStream = requireContext().contentResolver.openInputStream(uri)
    inputStream?.buffered()?.use {
        imageData = it.readBytes()
    }
}

// 3. 原来的onActivityResult方法完全删除即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:05