Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作。

直接上代码

package com.testandroid.webview;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.support.v7.app.AlertDialog;

import android.support.v7.app.AppCompatActivity;

import android.view.KeyEvent;

import android.view.View;

import android.webkit.JsResult;

import android.webkit.ValueCallback;

import android.webkit.WebBackForwardList;

import android.webkit.WebChromeClient;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;

import com.testandroid.R;

public class WebViewActivity extends AppCompatActivity {

private final String TAG = WebViewActivity.class.getSimpleName();

private Button button;

private WebView webView;

private String recgPic = "http://m.shitu.chinaso.com/mx/index.html";

public final static int FILECHOOSER_RESULTCODE = 1;

public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_web_view);

button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

}

});

initTestWebView();

}

private void initTestWebView() {

webView = (WebView) findViewById(R.id.tempWebView);

WiewSettings settings = webView.getSettings();

settings.setJavaScriptEnabled(true);

webView.setWebChromeClient(new WebChromeClient() {

@Override

public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());

builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);

builder.setCancelable(false);

builder.setIcon(R.mipmap.ic_launcher);

AlertDialog dialog = builder.create();

dialog.show();

result.confirm();

return true;

}

//扩展浏览器上传文件

//3.0++版本

public void openFileChooser(ValueCallback uploadMsg, String acceptType) {

openFileChooserImpl(uploadMsg);

}

//3.0--版本

public void openFileChooser(ValueCallback uploadMsg) {

openFileChooserImpl(uploadMsg);

}

public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {

openFileChooserImpl(uploadMsg);

}

@Override

public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {

onenFileChooseImpleForAndroid(filePathCallback);

return true;

}

});

webView.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

});

webView.loadUrl(recgPic);

}

public ValueCallback mUploadMessage;

private void openFileChooserImpl(ValueCallback uploadMsg) {

mUploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);

}

public ValueCallback mUploadMessageForAndroid5;

private void onenFileChooseImpleForAndroid(ValueCallback filePathCallback) {

mUploadMessageForAndroid5 = filePathCallback;

Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);

contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);

contentSelectionIntent.setType("image/*");

Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);

chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);

chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");

startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);

}

@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;

} else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5){

if (null == mUploadMessageForAndroid5)

return;

Uri result = (intent == null || resultCode != RESULT_OK) ? null: intent.getData();

if (result != null) {

mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});

} else {

mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});

}

mUploadMessageForAndroid5 = null;

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

//获取历史列表

WebBackForwardList mWebBackForwardList = webView

.copyBackForwardList();

//判断当前历史列表是否最顶端,其实canGoBack已经判断过

if (mWebBackForwardList.getCurrentIndex() > 0) {

webView.goBack();

return true;

}

}

return super.onKeyDown(keyCode, event);

}

}

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

android webview 选择图片上传,Android webview打开本地图片上传实现代码相关推荐

  1. 使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能

    使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能 查了很多博客,终于弄出来了.我就大概说一下.我的业务内容是要把一个表单统一上传上去,而且其中有字段也有图片. <div cl ...

  2. android picasso 显示本地图片,剖析Picasso加载压缩本地图片流程(解决Android 5.0部分机型无法加载本地图片的问题)...

    之前项目中使用Picasso遇到了一个问题:在Android 5.0以上版本的部分手机上使用Picasso加载本地图片会失败.为了解决这个问题,研究了一下Picasso加载和压缩本地图片的流程,才有了 ...

  3. 03_Windows10+OpenCV4.5.5打开本地图片进行图片处理 实时摄影并抓拍图片存入本机

    目录 添加外部库 添加头文件和命名空间 设计ui界面 1.打开本地图片 2.图像处理--腐蚀 封装函数 3.点击保存图片 定时器 4.打开摄像头 5.拍照 6.关闭摄像头 完整代码 可添加写入视频功能 ...

  4. Python tkinter 打开本地图片进行矩形框标注

    经常会遇到json报文中有图片URL,以及ROI的坐标x.y.w.h,然后需要验证下这个框在图片的什么位置,一般时候只能根据坐标值定性目测下.最近用tkinter写了个打开本地图片并且将rect的坐标 ...

  5. android删除本地图片,Android中结合contentResolver.delete和file.delete实现本地图片的删除...

    最近做的一个需求是:将拍照或相册的图片上传服务器后删除对应的本地图片.在实现这个简单的需求的过程中却碰到了两个意想不到的问题. 这两个问题源自于删除本地图片时选用的两个不同的方法 file.delet ...

  6. Vue中通过el-upload组件实现上传前预览本地图片

    1.实现效果如下图所示 用户选择本地待上传的图片,选择成功后,上传组件隐藏,呈现本地预览组件,单击图片并实现图片的放大呈现 2.template(相当于html)部分的代码如下 代码实现逻辑: 在el ...

  7. php接受本地图片上传,用php把本地要上传的图片经过剪切,存入数据库

    //获取上传临时文件路径 $uploadedfile = $_FILES['uploadfile']['tmp_name']; //获取源文件资源句柄.接收参数为图片路径,返回句柄 $source = ...

  8. 服务器怎么用u盘传文件进去_本地文件上传到linux服务器的几种方法

    本文介绍几种常见的方法,把文件上传到Linux服务器中!速维网络 常见有使用:scp命令.xshell软件里的xftp程序.U盘挂载.服务器自带的lrzsz程序. 一.scp使用说明: 1.把本机的文 ...

  9. python怎么在电脑上使用-使用python在本地电脑上快速处理数据

    大数据一般是在"云"上玩的,但"云"都是要钱的,而且数据上上下下的也比较麻烦.所以,在本地电脑上快速处理数据的技能还是要的. pandas 在比赛中学到的一个工 ...

  10. uni-app微信小程序image引入图片;background-image背景图引入图片;小程序预览本地图片;小程序图片过大引入报错;获取本地图片的网络地址;

    uni-app小程序图片使用有image标签和background-image背景图两种方式: 下有获取本地图片的网络地址方式:见第四步 一.方式一:使用image标签引入: uni-app官方ima ...

最新文章

  1. Linux 受到开发者偏爱的 9 个理由!
  2. 专访黄勇:Java在未来的很长一段时间仍是主流
  3. HEVC视频编码技术
  4. NV133FHM-N52屏在rk3288的Android7.1上的点亮
  5. IOS开发之JSON序列化从客户端发送到服务器端
  6. c# webbrowser  获取用户选中文字
  7. 什么影响oracle io,Oracle IO问题解析
  8. 远程客户端连接MysqL数据库太慢解决方案
  9. C++学习笔记-windows底层粗略认识
  10. 人生总是让人不知所错
  11. 是谁开发出手机曲面屏这种“反人类设计”?
  12. Java键盘交互设计输入法,儿童键盘输入交互方式探讨:为熊孩子设计的输入法...
  13. 让电机动起来!Arduino驱动步进电机教程
  14. python控制摄像头云台_python-onvif实现客户端控制相机云台
  15. 到底买苹果XS还是XR_iPhone XS和XR买哪个?10个理由告诉你XS更好,贵是有原因的!...
  16. [Bada开发]使用共享库
  17. 使用node实现向手机发送验证码
  18. 刚刚!鸿蒙OS 2升级用户破千万!(1000+企业共建鸿蒙生态)
  19. 取消GitHub邮箱订阅
  20. Apache Log4j Server 反序列化漏洞(CVE-2017-5645)

热门文章

  1. 登录注册页面(连接MySQL8.0.15版本)
  2. Javascript中call()和apply()的用法 ----1
  3. 记一次噩梦般的经历——论学会反编译的重要性
  4. HDOJ 1465 不容易系列之一
  5. HCIE-Security Day30:IPSec:实验(五)配置基于路由的IPSec PN(采用预共享密钥认证)
  6. 计算机网络网络层之链路状态路由算法
  7. OSPF报文分类与格式
  8. OSPFv3中LSA详解(六)——Type3类LSA详解
  9. Linux之软件安装rpm、yum/dnf、源码(安装)
  10. HDOJ--1233--还是畅通工程