kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决

简介: 在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。

在使用WebView开发Android应用时,onShowFileChooser方法通常用于允许用户从设备中选择文件。如果这个方法只能被触发一次,问题可能在于没有正确处理文件选择的回调结果。在WebView中,onShowFileChooser方法需要一个ValueCallback<Uri[]>作为参数,用于接收文件选择的结果。如果你没有正确地调用ValueCallback来传递结果,系统可能不会允许你再次触发文件选择器。

解决这个问题的关键在于确保你正确地处理了文件选择的结果,并且在文件选择完成后释放了ValueCallback。以下是一个典型的解决方案:

  1. 确保你有正确的WebChromeClient实现:
    在你的Activity中,确保你已经覆盖了WebChromeClientonShowFileChooser方法。
  2. 正确处理文件选择结果:
    当用户选择了一个文件并返回时,你需要调用ValueCallbackonReceiveValue方法来传递所选文件的Uri数组。
  3. 重置ValueCallback:
    一旦你传递了结果,记得将ValueCallback设置为null,这样系统才能知道可以选择另一个文件。

以下是一个具体的示例代码:


class MainActivity : AppCompatActivity(), ValueCallback<Array<Uri>> {

    private var mUploadMessage: ValueCallback<Array<Uri>>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView = findViewById<WebView>(R.id.webView)
        webView.webViewClient = WebViewClient()
        webView.webChromeClient = object : WebChromeClient() {
            override fun onShowFileChooser(
                window: Window?,
                filePathCallback: ValueCallback<Array<Uri>>?,
                fileChooserParams: FileChooserParams?
            ): Boolean {
                if (mUploadMessage != null) {
                    mUploadMessage = null
                }

                mUploadMessage = filePathCallback

                // 启动文件选择器
                val intent = fileChooserParams?.createIntent()
                startActivityForResult(intent, FILECHOOSER_RESULT_CODE)

                return true
            }
        }

        // 加载网页
        webView.loadUrl("https://example.com")
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == FILECHOOSER_RESULT_CODE) {
            if (mUploadMessage == null) {
                return
            }

            when (resultCode) {
                Activity.RESULT_OK -> {
                    // 从data Intent中获取Uri
                    val result = if (data == null || data.data == null) {
                        arrayOfNulls<Uri>(0)
                    } else {
                        data.clipData?.let { clipData ->
                            Array(clipData.itemCount) { i ->
                                clipData.getItemAt(i).uri
                            }
                        } ?: arrayOf(data.data!!)
                    }

                    mUploadMessage!!.onReceiveValue(result)
                    mUploadMessage = null
                }
                Activity.RESULT_CANCELED -> {
                    mUploadMessage!!.onReceiveValue(null)
                    mUploadMessage = null
                }
            }
        }
    }

    override fun onReceiveValue(result: Array<Uri>?) {
        // 这里不应该有代码,因为我们只需要传递结果给WebView,而不是处理结果
    }

    companion object {
        private const val FILECHOOSER_RESULT_CODE = 1
    }
}


在上面的代码中,onShowFileChooser方法被重写,以处理文件选择的启动。onActivityResult方法则负责处理文件选择的结果,并通过onReceiveValue方法将结果传递给WebView。

记住,在处理文件选择时,你可能需要考虑权限问题,特别是从Android 6.0(API级别23)开始,你需要动态请求存储权限。如果在Android 10(API级别29)及以上版本,你可能需要额外处理分区存储的影响。

目录
打赏
0
7
8
0
98
分享
相关文章
|
20天前
|
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
97 15
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
在当今移动社交领域,一对一视频和语音通话功能已成为用户期待的基础配置。从熟人社交到陌生人交友,从专业咨询到情感陪伴,实时音视频互动能力直接决定了社交App的用户留存和市场竞争力。山东布谷科技将深入探讨一对一直播源码开发高质量一对一视频和语音通话功能的关键要素和技术实现方案。
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
【一步步开发AI运动APP】二、跨平台APP AI运动识别方案介绍
本系列博文旨在帮助开发者从【AI运动小程序】迈向性能更优的【AI运动APP】开发。通过「云智AI运动识别」uni-app版插件,提供本地原生极速识别、精准姿态检测及运动计时计数功能,支持健身系统、线上赛事、学生体测、康复锻炼等多场景应用。插件无需云端依赖,一次付费永久使用,成本低且扩展性强。同时兼容uni-app与uni-app x框架,适合不同技术背景的开发者快速上手,助力抢占AI辅助运动市场。下篇将介绍插件引入,敬请期待!
【一步步开发AI运动APP】一、写在最前
本文介绍新系列【一步步开发AI运动APP】,旨在帮助开发者突破小程序限制,打造性能更强、体验更佳的AI运动APP。相比小程序,APP可充分利用CPU/GPU算力,实现高精度人体检测、多人检测等复杂功能。本系列基于跨平台框架`uni`及扩展插件`uni AI运动识别插件`,适合有小程序开发经验的开发者。内容涵盖抽帧、人体识别、运动分析、姿态交互等,逐步进阶实现完整AI运动APP,并支持多手机平台发布。
直播App程序源码开发前期功能调研:运营角度思考如何有利于推广运营获利
在直播App程序源码开发的前期,功能调研至关重要。除了技术实现的可行性,更需要从运营角度出发,思考哪些功能能够助力推广运营,最终实现获利。山东布谷科技从运营角度,对直播App功能进行调研分析
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
595 0
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
340 1
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)
1215 1
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
493 0
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
Android App开发手机阅读中实现平滑翻书效果和卷曲翻书动画实战(附源码 简单易懂 可直接使用)
590 0

物联网

+关注