当前位置: 首页 > news >正文

android嵌套网页遇到的问题总结

在android开发中,用webview嵌套页面遇到的问题

  1. 在用android开发应用中,遇到一个场景,是需要用webview嵌套一个上传文件的页面,当时遇到两个问题:
  • 选择文件的窗口没有弹出
  • 选中的文件和页面没有关联
  1. 针对第一个问题,最开始我是只调用了webView.setWebViewClient(new WebViewClient());,此时页面能正常打开,但是点击选择文件的时候,没有反应,处理的方式是,需要设置webView.setWebChromeClient(new WebChromeClient() ),且需要重写WebChromeClient方法,不然,还是没有办法弹窗选择文件的窗口,下面是重写的方式,至此,第一个问题就可以解决了
webView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {GameSDKActivity.mFilePathCallback = filePathCallback;Intent intent = fileChooserParams.createIntent();try {mActivity.startActivityForResult(intent, GameSDKActivity.FILE_CHOOSER_REQUEST_CODE);} catch (ActivityNotFoundException e) {GameSDKActivity.mFilePathCallback = null;Toast.makeText(mActivity, "无法打开文件选择器", Toast.LENGTH_SHORT).show();return false;}return true;}});
  1. 针对第二个问题,是因为Activity的回调函数onActivityResult 没有针对的功能实现,因为在View中调用mActivity.startActivityForResult的时候,传入FILE_CHOOSER_REQUEST_CODE,所有在Activity中需要对requestCode为FILE_CHOOSER_REQUEST_CODE的结果进行处理,简单说明如下:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == FILE_CHOOSER_REQUEST_CODE) {// 业务处理}
}

详细代码如下

页面布局

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

View代码

private void showFileTrans() {Dialog dialog = new Dialog(mActivity);dialog.setContentView(R.layout.dialog_webview);dialog.setCancelable(true);dialog.setCanceledOnTouchOutside(true);// 设置对话框样式Window window = dialog.getWindow();if (window != null) {WindowManager.LayoutParams params = window.getAttributes();DisplayMetrics displayMetrics = new DisplayMetrics();window.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);int screenWidth = displayMetrics.widthPixels;int screenHeight = displayMetrics.heightPixels;int minWidth = (int) (280 * mActivity.getResources().getDisplayMetrics().density);int maxWidth = (int) (screenWidth * 0.8);int dialogWidth = Math.min(maxWidth, Math.max(minWidth, (int) (320 * mActivity.getResources().getDisplayMetrics().density)));params.width = dialogWidth;params.height = (int) (screenHeight * 0.8); // 推荐用80%屏高params.gravity = Gravity.CENTER;window.setAttributes(params);}WebView webView = dialog.findViewById(R.id.webview);WebSettings settings = webView.getSettings();settings.setJavaScriptEnabled(true);settings.setDomStorageEnabled(true);settings.setAllowFileAccess(true); // 关键:允许文件访问settings.setAllowContentAccess(true); // 关键:允许内容访问settings.setLoadWithOverviewMode(true);settings.setUseWideViewPort(true);settings.setBuiltInZoomControls(true);settings.setDisplayZoomControls(false);settings.setSupportZoom(true);settings.setDefaultTextEncodingName("utf-8");settings.setCacheMode(WebSettings.LOAD_DEFAULT);settings.setMediaPlaybackRequiresUserGesture(false);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}webView.setWebViewClient(new WebViewClient());webView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {GameSDKActivity.mFilePathCallback = filePathCallback;Intent intent = fileChooserParams.createIntent();try {mActivity.startActivityForResult(intent, GameSDKActivity.FILE_CHOOSER_REQUEST_CODE);} catch (ActivityNotFoundException e) {GameSDKActivity.mFilePathCallback = null;Toast.makeText(mActivity, "无法打开文件选择器", Toast.LENGTH_SHORT).show();return false;}return true;}});webView.loadUrl("http://xxxxxxx");dialog.show();
}

Activity代码

public static ValueCallback<Uri[]> mFilePathCallback;
public static final int FILE_CHOOSER_REQUEST_CODE = 10001;@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == FILE_CHOOSER_REQUEST_CODE) {if (mFilePathCallback != null) {Uri[] results = null;if (resultCode == Activity.RESULT_OK) {if (data == null) {// 处理拍照等特殊情况Log.d("FileChooser", "data is null");} else {ClipData clipData = data.getClipData();if (clipData != null) {// 多选文件int count = clipData.getItemCount();results = new Uri[count];for (int i = 0; i < count; i++) {results[i] = clipData.getItemAt(i).getUri();Log.d("FileChooser", "Selected file: " + results[i]);}} else if (data.getData() != null) {// 单选文件results = new Uri[]{data.getData()};Log.d("FileChooser", "Selected file: " + results[0]);}}} else {// 用户取消选择Log.d("FileChooser", "User cancelled file selection");}mFilePathCallback.onReceiveValue(results);mFilePathCallback = null;}}}
http://www.dtcms.com/a/310074.html

相关文章:

  • mac系统自带终端崩溃修复
  • 使用自定义数据集训练 YOLOv12 以检测道路坑洞严重程度
  • 利用 AI 在 iPhone 上实现 App 文本情绪价值评估(上)
  • 基于Matlab的人眼虹膜识别门禁系统
  • 【Git 分支整合的艺术:岔路与归途的抉择 ——merge 与 rebase 深度解析】
  • Java函数式编程之【Stream终止操作】【下】【三】【收集操作collect()与分组分区和下游收集器】
  • 【MySQL】MySQL事务
  • 低空经济展 | 昂际智航携珑驭®系列产品亮相2025深圳eVTOL展
  • 向日葵软件提权
  • 第一篇:Linux 运维入门:虚拟机部署与基础环境配置
  • 《Java 程序设计》核心知识点梳理与深入探究
  • 工具Cursor(2)使用案例
  • 云函数编排深度解读:从概念到架构的全景指南
  • 计算声子谱
  • 详解K8s集群搭建:从环境准备到成功运行
  • 力扣面试150(46/150)
  • Spring AI MCP:解锁大模型应用开发新姿势
  • Idea快捷键
  • 从入仓到结算全自动化:易境通如何重构散货拼柜业务流程?
  • SpringBoot3.x入门到精通系列:1.3 创建第一个SpringBoot 3.x应用
  • LeetCode 刷题【24. 两两交换链表中的节点、25. K 个一组翻转链表】
  • Ubuntu 开启wifi 5G 热点
  • 数字孪生城市:以虚实映射为起点,开启城市全要素数字化转型新纪元
  • Docker学习其二(容器卷,Docker网络,Compose)
  • FEVER数据集:事实验证任务的大规模基准与评估框架
  • 如何安全管理SSH密钥以防止服务器被入侵
  • Wisdom SSH开启高效管理服务器的大门
  • 企业WEB应用服务器TOMCAT
  • 将Varjo XR技术融入战斗机训练模拟器,有效提升模拟训练沉浸感与效率
  • python简单操作达梦数据库