WebView文件上传开发中,为何重写onShowFileChooser提示未覆盖任何方法?
onShowFileChooser重写报错排查方案
核心报错逻辑
提示“未覆盖任何父类方法”的本质,是你编写的方法和父类WebChromeClient中的同名方法不构成重写关系,常见触发场景有三类:
- 方法签名不匹配
父类WebChromeClient中onShowFileChooser的定义要求三个参数完全对应匹配,常见不匹配情况:- 将可空参数写为非空类型:你当前代码里把第三个参数
fcp: FileChooserParams声明为非空,Kotlin编译器会直接判定这是一个和父类完全无关的新方法,不识别为重写 - 导入类错误:如果引入的
FileChooserParams不是android.webkit.WebChromeClient.FileChooserParams,而是其他同名类,参数类型和父类定义不一致,也会导致重写识别失效 - 参数顺序和父类定义不一致
- 将可空参数写为非空类型:你当前代码里把第三个参数
- 版本阈值不满足
该方法是Android 5.0(API 21)才加入WebChromeClient的公开API,如果项目配置的minSdkVersion低于21,编译阶段的类定义中根本不存在这个方法,自然无法覆盖。 - 本地缓存异常
当Android Studio缓存和已下载的SDK、AndroidX WebKit依赖版本不匹配时,会出现方法识别失效的问题,可通过清理缓存后重启项目解决。
代码修正参考
调整方法签名的可空性匹配要求,同时修正原代码中接口嵌套在类内部的语法问题:
class FileChooseClient(private val activity: ActivityChoser) : WebChromeClient() { override fun onShowFileChooser( v: WebView?, fpc: ValueCallback<Uri>?, fcp: FileChooserParams? // 修正:增加可空标记匹配父类签名 ): Boolean { if (activity.uploadMessage != null) { activity.uploadMessage?.onReceiveValue(null) activity.uploadMessage = null } activity.uploadMessage = fpc // 修正:对可空的fcp做空判断 val intent: Intent = fcp?.createIntent() ?: return false try { activity.startActivityForResult(intent, ActivityChoser.REQUEST_SELECT_FILE) (activity as Activity).overridePendingTransition( android.R.anim.fade_in, android.R.anim.fade_out ) } catch (e: ActivityNotFoundException) { activity.uploadMessage = null return false } return true } } // 修正:将接口从类内部移到外部,避免语法嵌套错误 interface ActivityChoser { companion object { const val REQUEST_SELECT_FILE = 100 } var uploadMessage: ValueCallback<Uri>? fun startActivityForResult(intent: Intent, req: Int) }
内容的提问来源于stack exchange,提问作者SICPRO
相关产品推荐
相关产品推荐

