Android webview在默认情况下是不支持网页中的文件上传功能的;

如果在网页中有,在android webview中访问时也会出现浏览文件的按钮

但是点击按钮之后没有反应...

那么如何能够让android的webview能够响应,这个浏览按钮呢?在网上查了很多资料,很多相同的,但都漏掉了一个地方,导致无法读取到文件的完整地址(“c:\upfile\233232.jpg”),整理最终代码入下:

我们需要为webview设置WebChromeClient,在WebChromeClient的实现类中覆盖文件选择的方法:

package com.example.webviewupfile;

import java.io.File;

import java.io.IOException;

import android.app.Activity;

import android.content.ContentResolver;

import android.content.Intent;

import android.content.res.Configuration;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore;

import android.util.Log;

import android.view.View;

import android.webkit.ValueCallback;

import android.webkit.WebChromeClient;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.ProgressBar;

public class MainActivity extends Activity {

private ValueCallback mUploadMessage;

private final static int FILECHOOSER_RESULTCODE = 1;

private WebView web;

private ProgressBar progressBar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

web = (WebView) findViewById(R.id.webView1);

progressBar = (ProgressBar) findViewById(R.id.progressBar1);

web = new WebView(this);

web.getSettings().setJavaScriptEnabled(true);

web.loadUrl("http://ueditor.baidu.com/website/onlinedemo.html");

web.setWebViewClient(new myWebClient());

web.setWebChromeClient(new WebChromeClient() {

// The undocumented magic method override

// Eclipse will swear at you if you try to put @Override here

// For Android 3.0+

public void openFileChooser(ValueCallback uploadMsg) {

mUploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

MainActivity.this.startActivityForResult(

Intent.createChooser(i, "File Chooser"),

FILECHOOSER_RESULTCODE);

}

// For Android 3.0+

public void openFileChooser(ValueCallback uploadMsg,

String acceptType) {

mUploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("*/*");

MainActivity.this.startActivityForResult(

Intent.createChooser(i, "File Browser"),

FILECHOOSER_RESULTCODE);

}

// For Android 4.1

public void openFileChooser(ValueCallback uploadMsg,

String acceptType, String capture) {

mUploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

MainActivity.this.startActivityForResult(

Intent.createChooser(i, "File Chooser"),

MainActivity.FILECHOOSER_RESULTCODE);

}

});

setContentView(web);

}

@Override

protected void onActivityResult(int requestCode, int resultCode,

Intent intent) {

if (requestCode == FILECHOOSER_RESULTCODE) {

if (null == mUploadMessage)

return;

Uri result = intent == null || resultCode != RESULT_OK ? null

: intent.getData();

// mUploadMessage.onReceiveValue(result);

// mUploadMessage = null;

Bitmap bm = null;

//外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口

ContentResolver resolver = getContentResolver();

try {

Uri originalUri = intent.getData(); // 获得图片的uri

bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);

// 这里开始的第二部分,获取图片的路径:

String[] proj = { MediaStore.Images.Media.DATA };

// 好像是android多媒体数据库的封装接口,具体的看Android文档

Cursor cursor = managedQuery(originalUri, proj, null, null,

null);

// 按我个人理解 这个是获得用户选择的图片的索引值

int column_index = cursor

.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

// 将光标移至开头 ,这个很重要,不小心很容易引起越界

cursor.moveToFirst();

// 最后根据索引值获取图片路径

String path = cursor.getString(column_index);

Uri uri = Uri.fromFile(new File(path));

mUploadMessage.onReceiveValue(uri);

} catch (IOException e) {

Log.e("TAG-->Error", e.toString());

}

}

}

public class myWebClient extends WebViewClient {

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

// TODO Auto-generated method stub

super.onPageStarted(view, url, favicon);

}

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

// TODO Auto-generated method stub

view.loadUrl(url);

return true;

}

@Override

public void onPageFinished(WebView view, String url) {

// TODO Auto-generated method stub

super.onPageFinished(view, url);

progressBar.setVisibility(View.GONE);

}

}

// flipscreen not loading again

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

}

// To handle "Back" key press event for WebView to go back to previous

// screen.

/*

* @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if

* ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { web.goBack();

* return true; } return super.onKeyDown(keyCode, event); }

*/

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android webview 多文件上传,Android中的webview支持页面中的文件上传实例代码相关推荐

  1. html tabl自动生成序列号,jQuery实现table中的tr上下移动并保持序号不变的实例代码...

    jQueryMoveTr.html 代码如下: jQuery-bhang aaaaaaaaaa @@@@@@@ 注释1 bbbbbbbbbbbbb ######### 注释2 cccccccccccc ...

  2. vue中组件在不同页面中渲染出错

    vue中组件在不同页面中渲染出错 封装了一个组件 封装了一个组件 遇到问题了,特向各位大佬请教 比如我封装了一个 child 组件 我在father 页面中引入 可以正常使用 而且css 样式不会出现 ...

  3. LaTeX中表格默认在页面中置顶怎么取消?

    LaTeX中表格默认在页面中置顶怎么取消? 表格.图都默认在这一页置顶,已尝试过以下方法均不行: 1.[htbp]调节方式,无论如何调节没有任何变化 2.\usepackage{float} + [H ...

  4. 微信小程序app.js中的全局变量globalData改变,如何通知其它页面界面显示改变,小程序中如何在其他页面中监听到globalData中值的变化

    微信小程序app.js中的全局变量globalData改变,如何通知其它页面界面显示改变,小程序中如何在其他页面中监听到globalData中值的变化 在小程序中,我们一般在app.js的onLaun ...

  5. 【python】把Excel中的数据在页面中可视化

    一. 需求      最近我们数据可视化的老师让我们把广州历史房价中的房价数据可视化,然后给我们发了广州历史房价.xls,然后看了一下数据确实有点小多,反正复制粘贴是有点费劲的,所以就想借用pytho ...

  6. 在ppt中插入html,PPT页面中插入浏览器方法 PPT中插入浏览器教程-PPT家园

    如何在PPT页面中插入浏览器 2018-04-01 14:42 责任编辑:pptjia 导读 / PPT中自带有浏览器的控件,叫做"MicrosoftWebBrowser"(当然如 ...

  7. iframe标签中写html,html页面中嵌套iframe标签,我们可以用html中的iframe标签搞定

    iframe嵌入网页的用法 iframe并不是很常用的,在标准的网页中非常少用.但是有朋友经常问到,下面我简单地介绍一下它的用法,你只要熟练掌握这些参数足矣. 也应该是框架的一种形式,它与不 ...

  8. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例

    在HTML页面的 中,可以用像下面的代码来添加标签: 复制代码代码如下: Your browser does not support HTML5 Canvas. 译注:对于canvas,以下写法是不允 ...

  9. spring mvc项目中,在jsp页面中输入中文时,提交到student.jsp页面后,结果显示中文乱码

    在jsp页面中输入中文时,提交到student.jsp页面后,结果显示中文乱码 下面是相关代码截图 表单代码: 控制器类代码: springmvc配置文件代码: 用于显示的jsp页面: 修改之前的we ...

最新文章

  1. Linux redhat 5.4上安装MYDNS
  2. 解决umount.nfs: /data: device is busy 问题
  3. android中的AIDL进程间通信
  4. 使用matlab构建一个信号、添加噪声信号并图示信号
  5. Selenium3+MySQL数据库进行数据驱动测试
  6. C++中用new和不用new定义类的对象的区别解答
  7. Effective C++: 05实现
  8. python十进制转换_Python进制转换
  9. oracle数据库的语言,oracle数据库语言类型
  10. [Android]HttpPost之post请求传递Json数据
  11. 宝塔面板 python管理器2.0安装Mrdoc
  12. lwj_C#_泛型使用
  13. Linux基本的键盘输入快捷键和一些常用命令
  14. 粒子群算法组卷_概率表示的二进制粒子群算法在组卷中的应用
  15. 2020计算机考试内容,2020年全国计算机二级OFFICE考试内容
  16. OpenGL模拟太阳系运行
  17. ML-Agents学习之RollerBall项目
  18. 2021-07-13 ARM cortex三个版本A、R、M简单介绍
  19. Stanford NER CRF FAQ
  20. bootstrap 后端模板

热门文章

  1. 【arduino】用VSCode替代Arduino编辑器,arduino VSCode编辑器
  2. SFTP连接GCP,向服务器发送文件方法,第三方工具生成密钥对连接GCP服务器(putty生成密钥远程连接服务器)...
  3. 阵元间隔为半波长的均匀分布16元线阵
  4. Linux驱动调试中的Debugfs的使用简介
  5. arcgis python 保存当前窗口图形为jpg
  6. Spring Boot 中使用 RabbitMQ
  7. 透视大数据时代下的物联网生活
  8. MySQL系列:innodb源代码分析之线程并发同步机制
  9. Openssh学习笔记
  10. [经典排序算法][集锦]