Android中webview学习

1、什么是webview

WebView是Android中的原生UI控件,主要用于在app应用中方便地访问远程网页或本地html资源。同时,WebView也在Android中充当Java代码和JS代码之间交互的桥梁。实际上,也可以将WebView看做一个功能最小化的浏览器。WebView这个控件又包含四大部分:WebSettings、WebViewClient、WebChromeClient、JavascriptInterface。通过四个类,我们可以为WebView设置基础功能和监听。

2、webview的基本使用

添加网络权限
在AndroidManifest.xml中添加以下内容

<uses-permission android:name="android.permission.INTERNET" />

添加layout的xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

WebView一些常用的API,如加载url、前进后退、清理缓存、状态管理更新

      // 加载url:webView.loadUrl(url)// 往请求头header增加参数val hashMap: HashMap<String, String> = HashMap()hashMap["name"] = "zhangsan"webView.loadUrl(url, hashMap)// 加载 HTML 页面的一小段内容webView.loadData("", "text/html", "utf-8")webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null)// 后退、前进:webView.canGoBack() //是否可以后退webView.goBack() //后退一页面webView.canGoForward() //是否可以前进webView.goForward() //前进一页面webView.goBackOrForward(-1) //后退或前进多少步,正前负退//清除缓存数据:// 清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.webView.clearCache(true)// 清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录.webView.clearHistory()// 这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。webView.clearFormData()//WebView的状态webView.onResume() // 可见状态webView.onPause() // 页面失去焦点变成不可见状态webView.pauseTimers() // 页面失去焦点变成不可见状态,对整个应用的webview起作用webView.resumeTimers() //恢复pauseTimers时的动作webView.destroy() //销毁

接下来进入到最基本的使用

webView = (WebView) findViewById(R.id.webview);
//加载网页链接
webView.loadUrl("https://www.baidu.com");

3、webview的WebSettings

WebSettings类的主要作用是为H5设置一些配置功能,如常用设置是否支持JSjavaScriptEnabled、设置缓存cacheMode。

      webSetting = webView.settings// 告诉WebView启用JavaScript执行。webSetting?.javaScriptEnabled = true//缓存//缓存模式webSetting?.cacheMode = WebSettings.LOAD_DEFAULT// 开启 DOM storage API 功能webSetting?.domStorageEnabled = true//开启 database storage API 功能webSetting?.databaseEnabled = true//开启 Application Caches 功能,还需要设置路径webSetting?.setAppCacheEnabled(true)webSetting?.setAppCachePath("")//设置WebView是否应使用其屏幕上的缩放控件和手势支持缩放。//可以使用{@link #setBuiltInZoomControls}设置应使用的特定缩放机制。//此设置不会影响使用{@link WebView#zoomIn()}和{@link WebView#zoomOut()}方法执行的缩放。默认值为{@code true}。webSetting?.setSupportZoom(true)//设置WebView是否应使用其内置的缩放机制。内置的缩放机制包括屏幕缩放控件(显示在WebView的内容上)以及使用捏合手势控制缩放。可以使用{@link #setDisplayZoomControls}设置是否显示这些屏幕上的控件。默认值为{@code false}webSetting?.builtInZoomControls = false// 是否支持ViewPort的meta tag属性,// 如果页面有ViewPort meta tag 指定的宽度,则使用meta tag指定的值,否则默认使用宽屏的视图窗口webSetting?.useWideViewPort = true// 设置WebView是否以概述模式加载页面,即缩小内容以适合屏幕宽度。// 当内容宽度大于WebView控件的宽度时,例如{@link #getUseWideViewPort} 已启用。默认值为{@code false}webSetting?.loadWithOverviewMode = true//设置渲染线程的优先级。与其他设置不同,此设置每个过程仅需要调用一次。默认值为{@link RenderPriority#NORMAL}。webSetting?.setRenderPriority(WebSettings.RenderPriority.HIGH)// 设置基础布局算法。这将导致WebView的重新布局。默认值为{@link LayoutAlgorithm#NARROW_COLUMNS}。webSetting?.layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL//启用或禁用WebView中的文件访问。//请注意,这仅启用或禁用文件系统访问。仍然可以使用file:/// android_asset和file:/// android_res访问资产和资源。webSetting?.allowFileAccess = true//告诉WebView在调用{@link WebView#requestFocus(int,android.graphics.Rect)}时是否需要将节点设置为具有焦点。默认值为{@code true}。webSetting?.setNeedInitialFocus(true)//告诉JavaScript自动打开窗口。// 这适用于JavaScript函数{@code window.open()}。默认值为{@code false}webSetting?.javaScriptCanOpenWindowsAutomatically = true//支持自动加载图片webSetting?.loadsImagesAutomatically = true//设置解码html页面时使用的默认文本编码名称。 *默认值为“ UTF-8”。webSetting?.defaultTextEncodingName = "utf-8"// 设置默认字体大小。默认值为16。webSetting?.defaultFontSize = 16//设置最小字体大小。预设值为8。webSetting?.minimumFontSize = 8/***  Webview在安卓5.0之前默认允许其加载混合网络协议内容*  在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webSetting?.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW}//获取WebView是否支持多个窗口。webSetting?.supportMultipleWindows()

4、webview的WebViewClient

WebViewClient的作用是处理各种通知和请求事件。比较常用的方法有shouldOverrideUrlLoading、onPageStarted、onPageFinished。

class BaseWebViewClient : WebViewClient {override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {//在网页上的所有加载都经过这个方法//比如在本地WebView加载H5,而不是浏览器return super.shouldOverrideUrlLoading(view, request)}override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {super.onPageStarted(view, url, favicon)//这个事件就是开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。}override fun onPageFinished(view: WebView?, url: String?) {super.onPageFinished(view, url)//在页面加载结束时调用。同样道理,我们可以关闭loading 条,切换程序动作。}override fun onReceivedError(view: WebView?,request: WebResourceRequest?,error: WebResourceError?) {super.onReceivedError(view, request, error)// (报告错误信息,当加载出错的时候会回调此方法)}override fun shouldInterceptRequest(view: WebView?,request: WebResourceRequest?): WebResourceResponse? {// 拦截替换网络请求数据return super.shouldInterceptRequest(view, request)}override fun shouldOverrideKeyEvent(view: WebView?, event: KeyEvent?): Boolean {//重写此方法才能够处理在浏览器中的按键事件。return super.shouldOverrideKeyEvent(view, event)}override fun onLoadResource(view: WebView?, url: String?) {super.onLoadResource(view, url)// 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。}override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) {super.doUpdateVisitedHistory(view, url, isReload)//(更新历史记录)}override fun onFormResubmission(view: WebView?, dontResend: Message?, resend: Message?) {super.onFormResubmission(view, dontResend, resend)//(应用程序重新请求网页数据)}override fun onReceivedHttpAuthRequest(view: WebView?,handler: HttpAuthHandler?,host: String?,realm: String?) {super.onReceivedHttpAuthRequest(view, handler, host, realm)//(通知主机应用程序WebView收到HTTP身份验证请求。主机应用程序可以使用提供的* {@link HttpAuthHandler}设置WebView对请求的响应。 *默认行为是取消请求}override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {super.onReceivedSslError(view, handler, error)//SSL过程发生错误,重写此方法可以让webview处理https请求。}override fun onScaleChanged(view: WebView?, oldScale: Float, newScale: Float) {super.onScaleChanged(view, oldScale, newScale)// (WebView缩放大小发生改变时调用)}override fun onUnhandledKeyEvent(view: WebView?, event: KeyEvent?) {super.onUnhandledKeyEvent(view, event)//(Key事件未被加载时调用)}}

5、webview的WebChromeClient

WebChromeClient是内核处理类,主要用于网站的加载进度、标题、图片文件选择、JS弹窗

class BaseWebChromeClient : WebChromeClient {override fun onProgressChanged(view: WebView?, newProgress: Int) {super.onProgressChanged(view, newProgress)//当前网页加载的进度}override fun onReceivedTitle(view: WebView?, title: String?) {super.onReceivedTitle(view, title)//网页title标题}override fun onReceivedIcon(view: WebView?, icon: Bitmap?) {super.onReceivedIcon(view, icon)//网页图标}override fun onShowFileChooser(webView: WebView?,filePathCallback: ValueCallback<Array<Uri>>?,fileChooserParams: FileChooserParams?): Boolean {//告诉客户端显示文件选择器。响应于用户按下“选择文件”按钮,调用它来处理具有“文件”输入类型的HTML表单。// 要取消请求,请调用<code> filePathCallback.onReceiveValue(null)</ code>并返回{@code true}。return super.onShowFileChooser(webView, filePathCallback, fileChooserParams)}override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {super.onShowCustomView(view, callback)// 通知主机应用程序当前页面已进入全屏模式。调用之后,Web内容将不再在WebView中呈现,而是在{@code view}中呈现。// 主机应用程序应将此视图添加到配置了{@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN}标志的窗口中,以便实际全屏显示此Web内容。}override fun onHideCustomView() {super.onHideCustomView()// 通知主机应用程序当前页面已退出全屏模式。// 宿主应用程序必须隐藏自定义视图(以前传递给{@link #onShowCustomView(View,CustomViewCallback)onShowCustomView()}的视图)。调用之后,Web内容将再次在原始WebView中呈现}override fun getDefaultVideoPoster(): Bitmap? {//webview视频未播放时默认显示占位图return super.getDefaultVideoPoster()}//通知主机应用程序该网页要显示JavaScript {@code alert()}对话框。//<p>如果此方法返回{@code false}或未被覆盖,则默认行为是显示一个包含警报消息的对话框并挂起JavaScript的执行,直到关闭对话框为止。//<p>要显示自定义对话框,应用应通过此方法返回{@code true},在这种情况下,默认对话框将不会显示,并且JavaScript 执行将被暂停。// 该应调用{@code JsResult.confirm()}(关闭自定义对话框时),以便可以恢复执行JavaScript。//<p>要取消显示对话框并允许JavaScript执行继续,请立即调用{@code JsResult.confirm()},然后返回{@code true}。//<p>请注意,如果将{@link WebChromeClient}设置为{@code null},或者根本没有设置{@link WebChromeClient},则默认对话框将被取消,并且Javascript将立即继续执行。//<p>请注意,默认对话框不会从父窗口继承{@link android.view.Display#FLAG_SECURE}标志。override fun onJsAlert(view: WebView?,url: String?,message: String?,result: JsResult?): Boolean {return super.onJsAlert(view, url, message, result)}// 通知主机应用程序该网页要显示JavaScript {@code Confirm()}对话框。//<p>如果此方法返回{@code false}或未重写,则默认行为是显示一个包含该消息的对话框并暂停JavaScript执行,直到该对话框被关闭为止。// 当用户按下“确认”按钮时,默认对话框将返回{@code true}到JavaScript {@code Confirm()}代码,而当用户按下“ cancel”时将返回{@code false}到JavaScript代码。 '按钮或关闭对话框。//<p>要显示自定义对话框,应用应通过此方法返回{@code true},在这种情况下,默认对话框将不会显示,并且JavaScript//执行将被暂停。该应用应调用 自定义对话框关闭时,{@ code JsResult.confirm()}或{@code JsResult.cancel()}。// <p>要取消显示对话框并允许JavaScript执行继续,请立即调用{@code JsResult.confirm()}或{@code JsResult.cancel()},然后返回{@code true}。//<p>请注意,如果将{@link WebChromeClient}设置为{@code null},或者根本没有设置{@link WebChromeClient},则会取消默认对话框,而默认值{@code false }将立即返回到JavaScript代码。//<p>请注意,默认对话框不会从父窗口继承{@link android.view.Display#FLAG_SECURE}标志。override fun onJsConfirm(view: WebView?,url: String?,message: String?,result: JsResult?): Boolean {return super.onJsConfirm(view, url, message, result)}// 通知主机应用程序该网页要显示JavaScript {@code hint()}对话框。// <p>如果此方法返回{@code false}或未被覆盖,则默认行为是显示一个包含该消息的对话框并暂停JavaScript执行,直到该对话框被关闭为止。// 取消该对话框后,JavaScript {@code hint()}将返回用户键入的字符串,如果用户按下“取消”按钮,则返回null。//<p>要显示自定义对话框,应用应通过此方法返回{@code true},在这种情况下,默认对话框将不会显示,并且JavaScript 执行将被暂停。// 该应用应调用 取消自定义对话框后,{@ code JsPromptResult.confirm(result)}。//<p>要取消显示对话框并允许JavaScript执行继续,请立即调用{@code JsPromptResult.confirm(result)},然后返回{@code true}。//<p>请注意,如果将{@link WebChromeClient}设置为{@code null},或者根本没有设置{@link WebChromeClient},则默认对话框将被取消,并且将返回{@code null}立即添加到JavaScript代码。//<p>请注意,默认对话框不会从父窗口继承{@link android.view.Display#FLAG_SECURE}标志。override fun onJsPrompt(view: WebView?,url: String?,message: String?,defaultValue: String?,result: JsPromptResult?): Boolean {return super.onJsPrompt(view, url, message, defaultValue, result)}}

6、webview的JavascriptInterface

可以通过addJavascriptInterface()设置JavascriptInterface,从而使JS可以直接调用JavascriptInterface设置好的方法,比如H5想要跳转Activity、打开原生视频等都可以通知App。

  webView?.addJavascriptInterface(CommonWebJsInterface(), "className")val MSG_OPEN_ACTIVITY = 1var UIHandler: UIHandle = UIHandle()class UIHandle : Handler() {private var commonWebViewActivity: CommonWebViewActivity? = nullprivate var jsonStr: String? = nullfun setJsonStr(jsonStr: String?) {this.jsonStr = jsonStr}override fun handleMessage(msg: Message) {if (commonWebViewActivity == null || commonWebViewActivity?.isFinishing == true) {removeCallbacksAndMessages(null)return}commonWebViewActivity?.wrapHandleMessage(msg,jsonStr)}}private fun wrapHandleMessage(msg: Message?, jsonStr: String?) {msg ?: returnif (msg.what == MSG_OPEN_ACTIVITY) {startActivity(Intent(this, WebViewActivity::class.java))}}inner class CommonWebJsInterface : WebJsInterface {// JS调用方法跳转Activity@JavascriptInterfaceoverride fun openActivity(jsonStr: String?) {UIHandler.setJsonStr(jsonStr)val msg = Message.obtain()msg.what = MSG_OPEN_ACTIVITYUIHandler.sendMessage(msg)}// JS调用方法播放视频@JavascriptInterfaceoverride fun playVideo(jsonStr: String?) {}}private interface WebJsInterface {@JavascriptInterfacefun openActivity(jsonStr: String?)@JavascriptInterfacefun playVideo(jsonStr: String?)}

7、最基本整合

  webView?.isEmpty() ?: returnval webSettings = webView.settingswebSettings.javaScriptEnabled = true //支持JSwebSettings.useWideViewPort =true // 如果页面有ViewPort meta tag 指定的宽度,则使用meta tag指定的值,否则默认使用宽屏的视图窗口webSettings.loadWithOverviewMode =true //即缩小内容以适合屏幕宽度。当内容宽度大于WebView控件的宽度时,例如{@link #getUseWideViewPort} 已启用webView?.webViewClient = CommonWebViewClient(this)private class CommonWebViewClient(val context: Context) : WebViewClient() {override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {url ?: return falsetry {if (!url.startsWith("http://") && !url.startsWith("https://")) {val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))context.startActivity(intent)}} catch (e: Exception) {return true}return super.shouldOverrideUrlLoading(view, url)}webView?.webChromeClient = CommonWebChromeClient()private inner class CommonWebChromeClient : WebChromeClient() {// 网页加载的进度override fun onProgressChanged(view: WebView?, newProgress: Int) {if (newProgress >= 100) {// 隐藏Loading页面}}webView?.addJavascriptInterface(CommonWebJsInterface(), "className")

8、借鉴文章

https://www.jianshu.com/p/04025fc50d02
https://www.jianshu.com/p/170bce5ab83b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目&#xff0c;翻阅了大量资料&#xff0c;也借鉴了不少项目&#xff0c;最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错&#xff0c;因此进行了实现。 一、核心功能设计 总的来说&#xff0c;我们需要能够实现实时检测视…

ELK 日志分析系统

目录 一、日志管理方案 二、完整日志系统基本特征 三、ELK 简介 ELK组件&#xff1a; 1、ElasticSearch 2、Logstash 3、Kibana 可以添加的其它组件&#xff1a; 1、Filebeat 2、缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 3、Fluentd 三、ELK …

github经常登不上去怎么办?

问题 想少些代码&#xff0c;多学习&#xff0c;少不了使用github&#xff0c;但是在国内经常上不去&#xff0c;很耽误事&#xff0c;这里提供一个简单方法&#xff0c;供参考。 github GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;可以让开发者共同协作开发软…

C++总结笔记

1. 简介 1、面向对象程序设计 面向对象的四大特性 1&#xff09;封装 2&#xff09;继承 3&#xff09;多态 4&#xff09;抽象 2、标准库 标准C由三个部分组成 1&#xff09;核心语言&#xff1a;提供了所有的构件块 2&#xff09;C标准库&#xff1a;提供了大量的函…

手写一个简单的RPC框架

文章目录 1、初识Dubbo2、RPC是什么3、多模块设计3.1、服务提供者3.2、注册中心实现3.3、HTTP协议内嵌tomcat启动 3.4、服务消费者测试优化 1、初识Dubbo Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能…

MySQL经典50题

目录 一、数据表介绍 二、练习题 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 2. 查询同时存在" 01 "课程和" 02 "课程的情况 3. 查询存在" 01 "课程但可能不存在" 02 "课程的情况…

大寒---每年的最后一个节气

# 大寒节气 # 大寒&#xff0c;是二十四节气中的最后一个节气。斗指丑&#xff1b;太阳黄经达300&#xff1b;于每年公历1月20日左右交节。大寒同小寒一样&#xff0c;都是表示天气寒冷程度的节气&#xff0c;大寒是天气寒冷到极致的意思。大寒节气处在三九、四九时段&#xf…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

【 使用路由建立多视图单页应用详细介绍】

使用路由建立多视图单页应用详细介绍 1. 多视图1.1 引入依赖库1.2 创建自定义组件 2. React&#xff08;使用React Router&#xff09;3. Angular&#xff08;使用Angular Router&#xff09;4. Vue&#xff08;使用Vue Router&#xff09; 1. 多视图 构建多视图的单页应用程序…

数据结构学习之顺序表(各种操作合集)

顺序表&#xff08;各种操作合集&#xff09; 顺序表的两种创建方式&#xff1a; 方式1&#xff1a;根据函数的返回值创建 通过返回值返回所申请的内存空间的首地址&#xff1b;示例代码&#xff1a; list_t *create_seq_list_1(){list_t *p (list_t *)malloc(sizeof(list…

009 Linux_文件系统 | 软硬链接

前言 本文将会向你介绍文件系统与软硬链接 文章重点 本文将会先向你介绍文件是如何在磁盘上进行管理的&#xff0c;关于文件的管理将会从管理属性和管理内容两方面来谈&#xff0c;最后会向你介绍软硬链接的概念 文件在磁盘中的管理 首先&#xff0c;假设一个磁盘200GB&#…

大健康中医领域的客户画像标签数据(一)

大健康中医领域的客户画像标签数据 目前国内市场上针对大健康领域的客户数据如何收集&#xff0c;如何系统分析客户在大健康中医领域的一体化链路数据。 分步骤 1&#xff0c;健康领域的客户标签 基础标签: - 年龄:老年、中年、青年 - 性别:男性、女性 - 客户类型:个人、医…

Linux中的共享内存

定义&#xff1a; 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数 据复制进共享内存中&#xff…

acwing讲解篇之94. 递归实现排列型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 定义递归深度deep&#xff0c;数字使用情况used&#xff0c;选择的数字顺序path 进行递归 终止条件为递归深度达到n层时&#xff0c;打印path&#xff0c;然后返回 深度加一 遍历未使用的数字&#xff0c;选择数字&am…

【rust/bevy】使用points构造ConvexMesh

目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 问题提出 在three.js中&#xff0c;可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeo…

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五 实验名称 温室盆栽灌溉系统 软件设计&#xff1a; 1. 定义对应的引脚和端口的别名。 2. 编写延时函数&#xff0c;用于控制程序的执行速度。 3. 编写LCD控制函数&#xff0c;包括发送命令和发送数据两种操作。 4. 编写显示函数&#xff0c;用于在LCD上显示字符串…

无人机打击激光器

激光器的应用非常广泛&#xff0c;涵盖了多个领域。以下是一些主要的激光器应用&#xff1a; 医疗领域&#xff1a;激光器在医疗行业中有着重要应用&#xff0c;比如用于激光手术&#xff08;如眼科手术&#xff09;、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造&#xff1a;在…

html form中的input有哪些类型?各是做什么处理使用的

在HTML表单中&#xff0c;input元素有多种类型&#xff0c;主要包括以下几种&#xff1a; button&#xff1a;用于定义可点击的按钮。 checkbox&#xff1a;用于定义复选框&#xff0c;用户可以选择多个选项。 file&#xff1a;用于定义文件输入字段&#xff0c;用户可以从本地…

无忧秘书智脑:轻松驾驭“看图说话”功能,职场沟通更高效

在现代职场中&#xff0c;有效的沟通是提升工作效率的关键。然而&#xff0c;有时候我们面对一张图片或图表&#xff0c;却难以用言语准确表达其中的信息。这时&#xff0c;无忧秘书智脑的“看图说话”功能就派上了用场。这篇文章将手把手教你如何使用这一功能&#xff0c;以及…

在使用go语言开发的时候,程序启动后如何获取程序pid

在Go语言中&#xff0c;标准库并没有直接提供获取进程ID&#xff08;PID&#xff09;的函数。通常&#xff0c;你可以使用os包和syscall包来调用底层的操作系统函数来获取PID。 以下是一个获取程序PID的示例代码&#xff1a; package mainimport ("fmt""os&qu…