Android WebView集成文件选择器:实现JotForm表单文件上传
Android WebView加载JotForm表单实现文件上传唤起文件管理器
要让WebView内的JotForm文件上传按钮唤起设备文件管理器,需要自定义WebChromeClient处理文件选择回调,并接收Activity返回的文件结果,以下是具体实现方案:
核心修改点
- 自定义
WebChromeClient,重写onShowFileChooser方法触发文件选择Intent - 保存WebView的文件选择回调,在
onActivityResult中返回选中的文件Uri - 适配不同Android版本的权限要求
修改后的完整代码
package com.example.orgs import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.KeyEvent import android.view.Window import android.webkit.* import androidx.appcompat.app.AppCompatActivity class SecondActivity : AppCompatActivity() { private lateinit var view: WebView private var mFilePathCallback: ValueCallback<Uri[]>? = null private val FILE_CHOOSER_REQUEST_CODE = 1001 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if ((keyCode == KeyEvent.KEYCODE_BACK) && view.canGoBack()) { view.goBack() return true } return super.onKeyDown(keyCode, event) } @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportRequestWindowFeature(Window.FEATURE_NO_TITLE) setContentView(R.layout.activity_second) view = findViewById(R.id.webView) // 基础WebView配置 view.settings.javaScriptEnabled = true view.settings.builtInZoomControls = false view.settings.domStorageEnabled = true // 适配表单本地存储需求 view.settings.allowFileAccess = true // 允许文件访问 view.webViewClient = MyWebClient() // 替换为自定义WebChromeClient处理文件上传 view.webChromeClient = object : WebChromeClient() { override fun onShowFileChooser( webView: WebView?, filePathCallback: ValueCallback<Uri[]>, fileChooserParams: FileChooserParams ): Boolean { // 清空旧回调,避免内存泄漏 mFilePathCallback?.onReceiveValue(null) mFilePathCallback = filePathCallback // 创建系统文件选择Intent val intent = fileChooserParams.createIntent() try { startActivityForResult(intent, FILE_CHOOSER_REQUEST_CODE) } catch (e: Exception) { mFilePathCallback = null return false } return true } } view.loadUrl("https://form.jotform.com/230447298445059") } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == FILE_CHOOSER_REQUEST_CODE) { // 解析选择的文件结果并返回给WebView val results = WebChromeClient.FileChooserParams.parseResult(resultCode, data) mFilePathCallback?.onReceiveValue(results) mFilePathCallback = null } } private inner class MyWebClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { if (url?.startsWith("tel:") == true || url?.startsWith("whatsapp:") == true) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(intent) return true } return false } } }
额外配置说明
权限配置:在
AndroidManifest.xml中添加对应权限(根据目标Android版本调整):<!-- Android 12及以下 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ 按需添加媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />若目标版本为Android 6.0+,需在代码中动态申请权限,确保用户授权后再触发文件选择。
WebView设置补充:开启
domStorageEnabled是为了适配JotForm表单的本地存储逻辑,避免表单功能异常。
内容的提问来源于stack exchange,提问作者Almir Gabriel
相关产品推荐
相关产品推荐

