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
相关产品推荐
相关产品推荐

