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

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
        }
    }
}

额外配置说明

  1. 权限配置:在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+,需在代码中动态申请权限,确保用户授权后再触发文件选择。

  2. WebView设置补充:开启domStorageEnabled是为了适配JotForm表单的本地存储逻辑,避免表单功能异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:32:03