我们在开发需求的时候,难免会接入一下第三方的H5页面,有些H5页面是具有上传照片的功能,Android 中的 WebView是不能直接打开文件选择弹框的 接下来我讲简单提供一下解决方案,先说一下思路 1.接收WebView打开文件选择器的通知 2.收到通知后,打开文件选择器等待用户选择需要上传的文件 3.在onActivityResult中得到用户选择的文件的Uri 4.然后把Uri传递给Html5 这样就完成了一次H5选择文件的过程,下面我把代码贴出来自习看一下 首先,WebView必须要支持JS交互,所以要打开JS交互 mWebView.getSettings().setJ 在Android应用开发中,WebView作为一个内置的浏览器组件,经常被用于加载和展示H5页面。然而,当H5页面需要实现文件上传功能时,由于安全和权限限制,Android的WebView并不能直接弹出系统文件选择器。本文将详细介绍如何解决这个问题,以确保用户能够在WebView中顺利上传本地文件。 我们需要确保WebView支持JavaScript交互。通过调用`WebView`的`getSettings().setJavaScriptEnabled(true)`方法,可以开启JavaScript的支持,这是与H5页面进行交互的基础。 当H5页面调用上传文件API时,WebView会触发`WebChromeClient`的相关回调方法。在不同的Android API版本上,这些回调方法的参数可能会有所不同。因此,我们需要适配不同版本的Android系统: 1. 对于API级别小于11(即Android 3.0)的设备,需要重写`WebChromeClient`的`openFileChooser`方法: ```java @Override public void openFileChooser(ValueCallback<Uri> valueCallback) { uploadMessage = valueCallback; openImageChooserActivity(); } ``` 2. 对于API级别等于或大于11的设备,需要处理接受类型和捕获参数: ```java @Override public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) { uploadMessage = valueCallback; openImageChooserActivity(); } ``` 3. 对于API级别等于或大于21(即Android 5.0)的设备,需要重写`onShowFileChooser`方法: ```java @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { uploadMessageAboveL = filePathCallback; openImageChooserActivity(); return true; } ``` 在这三个方法中,我们都保存了`ValueCallback`对象,以便后续向H5页面返回文件选择结果。接着,我们自定义一个`openImageChooserActivity`方法来启动文件选择器: ```java private void openImageChooserActivity() { Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); // 可以根据需求修改为其他类型的文件,如 "application/pdf" 或 "*/*" startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE); } ``` 当用户在文件选择器中选择了文件后,系统会调用`onActivityResult`方法。在这里,我们需要处理选择文件的结果,并将选中的`Uri`传递给H5页面: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FILE_CHOOSER_RESULT_CODE) { if (null == uploadMessage && null == uploadMessageAboveL) return; Uri resultUri = null; if (data != null) { resultUri = data.getData(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (uploadMessageAboveL != null) { uploadMessageAboveL.onReceiveValue(new Uri[]{resultUri}); uploadMessageAboveL = null; } } else { if (uploadMessage != null) { uploadMessage.onReceiveValue(resultUri); uploadMessage = null; } } } } ``` 这样,我们就完成了从H5页面到Android原生文件选择器的桥接,实现了WebView中的文件上传功能。需要注意的是,这个解决方案仅适用于选择本地文件,如果涉及到更复杂的文件操作,如文件预览、多文件选择等,可能还需要进一步扩展和优化。同时,为了兼容更多场景,可能需要处理其他类型的文件选择,以及考虑隐私政策和权限管理等问题。
- 粉丝: 8
- 资源: 928
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助