Compose实现webView文件选择

JetBrains Compose跨平台WebView支持 这个库的设计初衷就是为了解决在Compose跨平台项目中无法使用WebView展示Web页面的问题。该库分析了各个平台的WebView之间的通用能力,抽象了通用API,最后通过Kotlin跨平台提供的expect/actual技术,在各个平台层使用原生能力完成了API的实现。依赖组件库后,开发者只需要直接使用该组件库提供的WebView组件,即可在项目的所有支持平台中展示Web页面。这使得开发人员能够更加灵活和高效地构建和更新应用程序的用户界面,提供更好的用户体验,并在不同平台上实现一致性和兼容性。 阅读详情

最近在用compose重构公司的主要APP,由于compose的一些独特设计理念,开发中也遇到很多问题,大多数甚至网上找不到相关资料,只好自己查阅有些晦涩难懂的官方文档,摸索着解决,并记录下来,有需要的可以提供参考。

以前实现webView文件选择都是用Activity.startActivityForResult 和 onActivityResult回调,但是这两个方法由于存在安全问题,现在官方准备弃用,不推荐使用了,推荐使用registerForActivityResult 和 ActivityResultLauncher.lauch()方法来实现

一、compose中使用webView

这部分内容不是本篇文章重点,就不展开介绍了,可以参考网上其他文章,例如:Jetpack Compose - WebView 使用方法,或者直接看wanAndroid大佬的compose版wanAndroid的源码,文章地址:Compose+MVI+Navigation实现wanAndroid客户端,结构非常清楚

二、配置webSettings

注意要开启javaScriptEnabled

	@SuppressLint("SetJavaScriptEnabled")
    private fun setWebSettings() {
        val webSettings = webView.settings
        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.javaScriptEnabled = true
        //设置自适应屏幕,两者合用
        webSettings.useWideViewPort = true //将图片调整到适合webview的大小
        webSettings.loadWithOverviewMode = true // 缩放至屏幕的大小
        //缩放操作
        webSettings.setSupportZoom(true) //支持缩放,默认为true。是下面那个的前提。
        webSettings.builtInZoomControls = true //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.displayZoomControls = false //隐藏原生的缩放控件

        webSettings.domStorageEnabled = true // 开启 DOM storage API 功能

        //其他细节操作
        webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK //关闭webview中缓存
        webSettings.allowFileAccess = true //设置可以访问文件
        webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口
        webSettings.loadsImagesAutomatically = true //支持自动加载图片
        webSettings.defaultTextEncodingName = "UTF-8"//设置编码格式
    }

三、配置WebViewChromeClient

注意:重写onShowFileChooser()方法,该方法在Android5.0以前还有两个老版本,但是我项目minSDK > 23所以就重写这一个版本就好了

	private var uploadMessageAboveL: ValueCallback<Array<Uri>>? = null
	
	inner class ProgressWebViewChromeClient : WebChromeClient() {
        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)
            progressBar.progress = newProgress
        }

        override fun onReceivedTitle(view: WebView?, title: String?) {
            super.onReceivedTitle(view, title)
        }

        override fun onShowFileChooser(
            webView: WebView?,
            filePathCallback: ValueCallback<Array<Uri>>?,
            fileChooserParams: FileChooserParams?
        ): Boolean {
            uploadMessageAboveL = filePathCallback
            MyApp.imageResultLauncher.launch("image/*")
            return true
        }
    }

四、注册ResultLauncher

我是在Application中创建和持有,在Activity的onCreate中注册

由于框架结构性能等原因,compose推荐只有一个Activity,我的项目中因为需要集成微信登陆,所以只有一个WxEntryActivity作为主Activity

@HiltAndroidApp
class MyApp: Application() {

    companion object {
        @SuppressLint("StaticFieldLeak")
        lateinit var CONTEXT: Context

        //创建ActivityResultLauncher,用于接收onActivityResult的回调信息
        lateinit var imageResultLauncher: ActivityResultLauncher<String>

        //将ActivityResultLauncher的回调信息传递给MutableLiveData,并在web组件中监听该LiveData
        val imageResult: MutableLiveData<List<Uri>> = MutableLiveData()

    }

    override fun onCreate() {
        super.onCreate()
        CONTEXT = this
    }
}
@AndroidEntryPoint
class WXEntryActivity : ComponentActivity() {

    companion object {
        const val TAG = "WXEntryActivity"

        //因为只有这一个Activity,所以可以作为全局的lifeCycleOwner
        lateinit var instant: WXEntryActivity
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ...
        }
        instant = this

        //注册图片选择器
        imageResultLauncher = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) {
            //获取到了图片,传递给LiveData
            LogUtils.i("WXEntryActivity", "resultLauncher: $it")
            imageResult.value = it
        }
    }
}

五、创建result的LiveData或者flow来设置(发送)和观察(接受)数据

在上一步代码中可以看到,我也是在Application中创建和持有imageResult这个LiveData

然后在注册的图片选择器结果回调中更新数据

最后在webViewCtrl中监听数据变化,并调用uploadMessageAboveL 的 onReceiveValue 回调。其中uploadMessageAboveL 是啥不清楚的见第三步,在onShowFileChooser中将filePathCallBack引用给它

	private fun initObserver() {
        LogUtils.d("WebViewCtrl", "initObserver")
        MyApp.imageResult.observe(WXEntryActivity.instant){
            LogUtils.d("WebViewCtrl", "observe: $it")
            uploadMessageAboveL?.onReceiveValue(it.toTypedArray())
        }
    }
kotlin compose 实现 webView 加载视频,支持Webview 全屏及退出全屏 kotlin compose 实现 webView 加载视频,支持Webview 全屏及退出全屏; 资料是主要代码,配置操作:1. AndroidManifest 配置 android:hardwareAccelerated ="true" 2. 支持横竖屏旋转 android:windowSoftInputMode="adjustResize" 3. kotlin compose 实现webview 视频渲染,全屏,退出全屏 (核心资料下载) 立即下载

相关推荐

边缘AI硬件风向:从专用芯片到端侧大模型

边缘AI硬件正呈现五大发展趋势:专用AI加速芯片(如华为昇腾、谷歌EdgeTPU)凭借高能效比成为主流;端侧大模型催生支持Transformer架构的新硬件需求;存算一体技术突破内存墙限制;FPGA和可重构计算提供灵活性;异构集成与Chiplet技术实现模块化设计。这些发展需要配套软件工具链支持,未来边缘设备将演变成具备本地智能的"智能体",竞争焦点转向算力、能效、易用性和成本的多维平衡。

qq_37027335的博客 347

使用Jetpack Compose集成WebView

在Android开发中,WebView是一个非常重要的组件,它可以用来显示网页或加载在线内容。然而,在Jetpack Compose(Google推出的新的UI工具包)中,目前没有内置的WebViewComposable。但不必担心,你可以使用AndroidView来包装传统的Android View并在Compose中使用它。在这篇文章中,我将演示如何在Jetpack Compose中使用WebView。

江小白的博客 3295

IEEE LaTeX模板中algorithm排版避坑指南:如何优雅地嵌入算法描述?

本文详细解析了在IEEE LaTeX模板中优雅排版algorithm的实用技巧,包括基础配置、高级自定义及常见问题解决方案。通过嵌套环境与[H]参数的应用,帮助研究者克服IEEEtran模板对算法排版的限制,实现专业且美观的算法呈现。

weixin_28340315的博客 408

在Jetpack Compose中使用WebView

WebView是我们在开发中经常会使用到的组件,我们可以用它来展示动态的Html页面。在Android的View体系中,我们可以直接在xml中添加WebView组件即可使用。但是在Jetpack Compose中,并没有可以直接使用的WebView组件。那么我们该如何在Compose中使用WebView呢?幸运的是,现在已经有一个成熟的第三方库可以提供这些能力的支持。它提供了一个可以直接在Compose中使用的WebView组件。这样,开发者就不需要自行去实现WebView的封装逻辑。

weixin_51235693的博客 1968

右腿驱动电路设计:从共模干扰原理到生物电采集实战

在生物电信号采集领域,共模干扰是影响测量精度的核心挑战之一,其本质源于环境电磁场通过容性耦合在人体表面产生的感应电流。根据欧姆定律,由于人体组织阻抗的不均衡性,共模电流会在不同测量点产生差异化的压降,从而转化为难以滤除的差分噪声。为解决这一问题,右腿驱动技术应运而生,它通过负反馈原理主动抵消干扰,显著提升系统的共模抑制比。该技术广泛应用于心电图、脑电图等医疗电子设备中,是确保微弱生理信号质量的关键环节。本文结合工程实践,深入剖析了右腿驱动电路中的仪表放大器选型、反馈环路稳定性设计以及PCB布局布线要点,为高

weixin_31476015的博客 442

高通量测序数据分析:RNA-seq

深度测序相关数据库与数据格式 SRA toolkit 一、NCBI 和EBI、DDBJ组成INSDC,数据内容相同所以找NCBI就行。 (一)NCBI常用数据库 GenBank:遗传序列数据库,收集了所有公开的DNA序列及其注释 GEO (Gene Expression Omnibus) :收集整理各种表达芯片数据,后来加入了甲基化、lncRNA、miRNA、CNV等其他芯片,还有高通量测序数据...

qq_41134363的博客 3万+

Compose 中使用 WebView

回退到原生 AndroidView 实现。

Mark Wu 的博客 2436

SAP Gateway 故障排查全景图:从 Error Log 到 E2E 追踪,一套面向实战的工具与方法论

本文针对SAP Gateway Foundation(SAP_GWFND)的故障排查需求,梳理了从现象到根因的系统化排查路径。文章首先强调建立标准化排障流程的重要性,随后提供工具矩阵及使用顺序指引:对于请求中断优先查看Error Log(/IWFND/ERROR_LOG和/IWBEP/ERROR_LOG),性能问题使用Performance Trace(/IWFND/TRACES),通知异常则检查Notification Monitor。重点工具包括: Error Log作为中断类错误首要定位器; Appl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

如何在Compose跨平台中实现一个简易WebView

本文将详细介绍如何编写一个简易的WebView组件,以支持在Compose跨平台项目中展示Web页面。

weixin_51235693的博客 2528

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点

🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 226

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

android Compose 实现 webView

请注意,使用原生的WebView可能会导致与Compose的交互和布局系统之间的一些冲突和限制。在某些情况下,您可能需要更多的定制化和与Compose的集成,这可能需要更多的工作。中,我们使用了一个工厂函数来创建原生的WebView实例,并对其进行一些设置。在这里,我们启用了JavaScript,并加载了指定的URL。在Compose中,目前还没有原生的WebView组件。来将传统的WebView集成到Compose中。的Compose函数,它接受一个URL作为参数。在这个示例中,我们创建了一个名为。

GYBIN02的专栏 1508

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 729

【亲测免费】 Compose WebView 多平台库教程

Compose WebView Multiplatform 是一个由 Kevin Zou 开发的开源库,专为JetBrains Compose多平台框架设计。这个库提供了一个可以直接在共享模块中使用的WebView组件,使得开发者可以在Android、iOS和桌面平台上加载和渲染网页内容。它简化了跨平台开发中集成WebView的需求,避免了对每个平台单独实现的复杂工作。 ## 2. 项目快速启动...

gitblog_00606的博客 782

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Jetpack Compose WebView封装教程

Jetpack Compose WebView封装教程 1. 项目介绍 Compose-WebView 是一个专为 Jetpack Compose 设计的 WebView 组件封装库,由开发者 Kevin Zou 创建并维护。它简化了在现代化的UI框架——Jetpack Compose中集成WebView的过程,使得加载和显示网页内容变得更加简便。通过这个库,开发人员可以轻松地在Compose应用...

gitblog_00911的博客 675

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

快速跑通本地量化回测:从策略示例到实盘的完整指南

Qbot 是一个完全本地部署的 AI 量化投研平台,覆盖数据管理、策略开发、回测验证与实盘交易的全流程。过去你要手动导行情数据、改策略参数、等回测结果出图,现在这些步骤都由脚本和界面替你跑完,你只需要在本地终端执行两条命令。回测收益曲线、夏普比率、最大回撤等指标在本地机器上生成,数据不出机器。 ## 手动拉数据、调参数,一次策略回测折腾一晚上 想验证一个交易想法,你得先找数据接口拉 K 线、存

gitblog_00841的博客 711

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

使用指南:Compose-WebView 开源项目详解

使用指南:Compose-WebView 开源项目详解 1. 项目目录结构及介绍 Compose-WebView 是一个专为 Jetpack Compose 设计的 WebView 组件封装库。它简化了在现代Android应用中集成WebView的过程。以下是项目的基本目录结构及其简介: └── compose-webview ├── build.gradle.kts - 构...

gitblog_01026的博客 687

Compose WebView Multiplatform 项目教程

``` compose-webview-multiplatform/ ├── docs/ ├── gradle/ │ └── wrapper/ ├── media/ ├── samples/ ├── tools/ ├── webview/ ├── .editorconfig ├── .gitignore ├── LICENSE.txt ├── README.md ├── README.desk...

gitblog_00926的博客 603

基于JetBrains Compose的跨平台WebView库

`Compose-Webview-Multiplatform` 是一个专为JetBrains Compose Multiplatform设计的开源WebView库,它支持在Android、iOS和桌面平台上加载URL、HTML和POST数据。这个库借鉴了Google的Accompanist Web库,并提供了基本的WebView功能,但增加了跨平台的支持。 ### 项目技术分析 1. **An...

gitblog_00007的博客 770

Jetpack Compose - WebView基础使用

WebView是我们在开发中经常会使用到的组件,我们可以用它来展示动态的Html页面。在Android的View体系中,我们可以直接在xml中添加WebView组件即可使用。但是在Jetpack Compose中,并没有可以直接使用的WebView组件。那么我们该如何在Compose中使用WebView呢?这篇文章将介绍如何在Jetpack Compose中使用WebView,并使用其基础功能。

weixin_51235693的博客 2022

探索跨平台的力量:JetBrains Compose Multiplatform下的WebView解决方案

随着跨平台开发的兴起,开发者们越来越重视能在不同操作系统间无缝切换的工具和框架。今天,我们聚焦于一个强大的库——**WebView for JetBrains Compose Multiplatform**,这是一款专为追求原生体验和高效代码复用而设计的开源项目。 ## 项目介绍 **WebView for JetBrains Compose Multiplatform**,作为一个高度集成的...

gitblog_00832的博客 684

Android Compose 新闻App(六)导航动画、WebView、浮动按钮、底部导航

Android Compose 新闻App(六)导航动画、WebView、浮动按钮、底部导航前言正文一、导航动画① 添加依赖② 使用二、WebView使用① 导航传递URL参数② 配置WebView三、FloatingActionButton使用① 修改默认显示位置四、App主页面构建① 密封类② 构建底部导航Item③ 装载底部导航Item④ 显示导航五、源码 前言   在上篇文章中完成了页面的导航,而在本篇文章中将会有更多新的Compose用法,一起来看看吧。 正文   一些应用有一些花里花哨的操作就会

晨曦 3210

Android Compose webView

本文来源:BitCoder老师的视频翻译,感谢老师的指点,也分享给大家 废话不多说,直接上代码

qq_28673213的博客 1557

AndroidX 官宣信号:Compose版WebView要来了!

已经出现在 AndroidX 主干里,模块说明指向“显示网页的 composable”,但当前 API 文件还是空的。相信很多人都会期待Compose版的WebView吧!

黄林晴 337

探索未来App构建的得力助手:Compose WebView

探索未来App构建的得力助手:Compose WebView 在Android开发的浪潮中,Jetpack Compose以其简洁高效的声明式编程方式正逐渐成为构建UI的新宠。然而,随着官方对某些组件策略的调整,Web视图的支持成了开发者心中的一抹空白。正是在这个背景下,Compose WebView横空出世,由热心贡献者KevinnZou基于废弃的Accompanist Web库进行维护和升级,...

gitblog_00730的博客 401

Android compose wandroid app之项目页面的实现

项目页面的实现前言获取数据ScrollableTabRow实现顶部滑动菜单ScrollableTabRow属性解析将ScrollableTabRow和HorizontalPager进行绑定根据各种属性设置样式循环添加tabs子项元素HorizontalPager 实现页面数据列表列表样式使用HorizontalPager加载页面Compose中Webview的使用AndroidView的属性使用Webview源码地址 前言 之前已经实现首页和分类页面,今天来实现项目页面,主要是一个顶部的滑动菜单,和下面滑动

theyangchoi的博客 3433
上一篇: kotlin学习笔记——变量、可空与非空
下一篇: Could not write standard input to Gradle Test Executor x.问题解决记录
LiePy
博客等级 码龄7年 1927粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值