super.onActivityResult已废弃,Kotlin新手如何更新实现WebView相机图片返回?
用Activity Result API替代废弃的onActivityResult实现相机图片返回WebView
重构步骤:
注册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) }统一处理图片结果回调
编写通用函数处理返回的Uri,回调给WebView的imagePathCallback:private fun handleImageCallback(uri: Uri?) { val results = uri?.let { arrayOf(it) } imagePathCallback?.onReceiveValue(results) imagePathCallback = null }在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 } }实现相机图片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)!! }清理旧代码
删除原来的onActivityResult方法,同时确保动态申请相机权限(Android 6.0+)。
内容的提问来源于stack exchange,提问作者Xilitom
相关产品推荐
相关产品推荐

