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

super.onActivityResult已废弃,Kotlin新手如何更新实现WebView相机图片返回?

用Activity Result API替代废弃的onActivityResult实现相机图片返回WebView

重构步骤:

  1. 注册Activity Result Launcher
    在你的Activity/Fragment中,分别注册处理拍照和相册选择的Launcher,替代原来的startActivityForResult:

    // 处理相册选图
    private val pickImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
        handleImageCallback(uri)
    }
    
    // 处理拍照(需传入保存图片的Uri)
    private val takePictureLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess: Boolean ->
        val uri = if (isSuccess) cameraImagePath?.let { Uri.parse(it) } else null
        handleImageCallback(uri)
    }
    
  2. 统一处理图片结果回调
    编写通用函数处理返回的Uri,回调给WebView的imagePathCallback:

    private fun handleImageCallback(uri: Uri?) {
        val results = uri?.let { arrayOf(it) }
        imagePathCallback?.onReceiveValue(results)
        imagePathCallback = null
    }
    
  3. 在WebView的文件选择逻辑中使用Launcher
    重写WebChromeClient的onShowFileChooser,触发相机或相册选择:

    webView.webChromeClient = object : WebChromeClient() {
        override fun onShowFileChooser(
            webView: WebView?,
            filePathCallback: ValueCallback<Array<Uri>>?,
            fileChooserParams: FileChooserParams?
        ): Boolean {
            imagePathCallback = filePathCallback
            // 生成相机图片保存Uri(Android 10+适配)
            val cameraUri = createCameraImageUri()
            cameraImagePath = cameraUri.toString()
            // 启动相机
            takePictureLauncher.launch(cameraUri)
            // 若要启动相册,替换为:pickImageLauncher.launch("image/*")
            return true
        }
    }
    
  4. 实现相机图片Uri生成(适配Android版本)
    Android 10及以上需通过MediaStore创建Uri,避免存储权限问题:

    private fun createCameraImageUri(): Uri {
        val contentValues = ContentValues().apply {
            put(MediaStore.Images.Media.DISPLAY_NAME, "web_camera_${System.currentTimeMillis()}.jpg")
            put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/WebCamera")
            }
        }
        return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
    }
    
  5. 清理旧代码
    删除原来的onActivityResult方法,同时确保动态申请相机权限(Android 6.0+)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:15:37