Android 14 WebView onShowFileChooser回调始终返回Activity已取消求助
Android 14 Beta下WebView文件选择器返回取消状态的解决方案
以下是针对该问题的几种可行修复方案:
添加Intent权限标记
Android 14 Beta中,系统文件选择器可能需要明确的URI权限标记才能正常返回结果。修改onShowFileChooser中启动Intent的代码,补充读取和写入权限标记:inner class ChromeClient : WebChromeClient() { override fun onShowFileChooser( webView: WebView, filePathCallback: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams ): Boolean { Log.i("info", "CALLED ONSHOWFILECHOOSER") fileCallback = filePathCallback val intent = fileChooserParams.createIntent() // 添加权限标记 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) fileSelectorCallback.launch(intent) return true } }替换为专用ActivityResult合约
放弃通用的StartActivityForResult合约,改用针对文件选择的专用合约,适配Android 14的行为逻辑:// 替换原有的fileSelectorCallback private val fileSelectorCallback = registerForActivityResult(ActivityResultContracts.GetMultipleContents("*/*")) { uris -> fileCallback?.let { cb -> fileCallback = null cb.onReceiveValue(if (uris.isEmpty()) null else uris.toTypedArray()) } } inner class ChromeClient : WebChromeClient() { override fun onShowFileChooser( webView: WebView, filePathCallback: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams ): Boolean { Log.i("info", "CALLED ONSHOWFILECHOOSER") fileCallback = filePathCallback // 根据文件选择参数动态设置类型 val acceptType = fileChooserParams.acceptTypes.firstOrNull() ?: "*/*" fileSelectorCallback.launch(acceptType) return true } }检查Activity启动模式
若你的WebView所属Activity使用了singleInstance或singleTask启动模式,Android 14 Beta中可能会导致文件选择器返回结果异常。修改AndroidManifest.xml中对应Activity的启动模式:<activity android:name=".YourWebViewActivity" android:launchMode="standard"> <!-- 其他配置项 --> </activity>更新WebView版本
Android 14 Beta可能存在WebView相关的兼容性bug,尝试将Android System WebView更新至最新稳定版或Beta版,查看是否已修复该问题。
内容的提问来源于stack exchange,提问作者Tanishq
相关产品推荐
相关产品推荐

