前言:

这个功能其实我才刚接触。不熟...在这个给大家提供的都是经过本人验证之后的一些案例。可以在项目中跑的。

最近项目嵌入混合开发,都是使用WebView来跳转,页面展示。有用到这个图片上传的功能。

原本是一脸懵的,查了很多资料看一些大神都写的很多代码很复杂(原谅我是小白)

正文:

先看一下效果先:

代码:

我这里代码都是写在Fragment里面的 直接看 initWeb()方法就好了

/**  * Created by WL-鬼 on 2017/7/10.   */
public class WebFragment extends BaseFragment {  private String webUrl = APIConstants.WEB_ROOT + "index.php";  private static volatile WebFragment webFragment;    @BindView(R.id.h5WebView)  WebView h5WebView;  @BindView(R.id.tribal_web_progressbar)  ProgressBar webProgressBar;  public ValueCallback<Uri[]> mUploadMessageForAndroid5;  public ValueCallback<Uri> mUploadMessage;    public final static int FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5 = 2;    private final static int FILE_CHOOSER_RESULT_CODE = 1;// 表单的结果回调    private Uri imageUri;    @Override    public int getLayoutRes() {    return R.layout.fragment_web;    }    @Override    public void init(Bundle savedInstanceState) {  initWeb();    }    @Override    public void initEvent() {    }    // 初始化webview    @SuppressLint("SetJavaScriptEnabled")  private void initWeb() {    WebSettings mWebSettings = h5WebView.getSettings();  mWebSettings.setJavaScriptEnabled(true); //允许加载javaScript    mWebSettings.setSupportZoom(true);       //是否允许缩放    mWebSettings.setUseWideViewPort(true);   //设置加载进来的页面自适应手机屏幕    mWebSettings.setLoadWithOverviewMode(true);    mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);    mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);    h5WebView.canGoBack();  h5WebView.loadUrl(webUrl);    //H5加载链接监听    h5WebView.setWebViewClient(new WebViewClient() {  @Override    public boolean shouldOverrideUrlLoading(WebView view, String url) {    Intent intent = null;  //根据拦截的url来判断是否拦截跳转  if (url.contains("test")) {    intent = new Intent(getContext(), Test.class);  } else if (url.contains("returnBackController")) {    ...    }else if (url.contains("....")) {                  h5WebView.loadUrl("javascript:reload()");    }else {    h5WebView.loadUrl(webUrl);    }    if (intent != null){    startActivity(intent);    }    return true;    }    @Override    public void onPageStarted(WebView view, String url, Bitmap favicon) {  super.onPageStarted(view, url, favicon);    }    @Override    public void onPageFinished(WebView view, String url) {    super.onPageFinished(view, url);    }    });    //H5界面加载进度监听    h5WebView.setWebChromeClient(new WebChromeClient(){  @Override    public void onProgressChanged(WebView view, int newProgress) {    if (webProgressBar != null){    if (newProgress > 95){    webProgressBar.setVisibility(View.GONE);  }else if (newProgress < 95 && webProgressBar.getVisibility() == View.GONE){    webProgressBar.setVisibility(View.VISIBLE);    }    webProgressBar.setProgress(newProgress);    }    super.onProgressChanged(view, newProgress);    }    // For Android < 5.0    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {    openFileChooserImpl(uploadMsg);    }    // For Android => 5.0    public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> uploadMsg,    WebChromeClient.FileChooserParams fileChooserParams) {    onenFileChooseImpleForAndroid(uploadMsg);    return false;    }    });  /**  * 监听手机返回按键,点击返回H5就返回上一级  */  h5WebView.setOnKeyListener(new View.OnKeyListener() {  @Override    public boolean onKey(View v, int keyCode, KeyEvent event) {  if ((keyCode == KeyEvent.KEYCODE_BACK) && h5WebView.canGoBack()) {    h5WebView.goBack();    return true;    }    return false;    }    });    }    /**  * android 5.0 以下开启图片选择(原生)  *  * 可以自己改图片选择框架。  */  private void openFileChooserImpl(ValueCallback<Uri> 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"), FILE_CHOOSER_RESULT_CODE);    }    /**  * android 5.0(含) 以上开启图片选择(原生)  *   * 可以自己改图片选择框架。  */  private void onenFileChooseImpleForAndroid(ValueCallback<Uri[]> 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, FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5);    }    @Override    public void onActivityResult(int requestCode, int resultCode,Intent intent) {    Uri result = (intent == null || resultCode != Activity.RESULT_OK) ? null: intent.getData();  switch (requestCode){    case FILE_CHOOSER_RESULT_CODE:  //android 5.0以下 选择图片回调  if (null == mUploadMessage)    return;    mUploadMessage.onReceiveValue(result);    mUploadMessage = null;    break;    case FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5:  //android 5.0(含) 以上 选择图片回调  if (null == mUploadMessageForAndroid5)    return;    if (result != null) {    mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});    } else {    mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});    }    mUploadMessageForAndroid5 = null;    break;    }    }else {//这端必须要加的,避免重复调起相册,没反应的问题if (mUploadMessage != null){mUploadMessage.onReceiveValue(null);mUploadMessage = null;}if (mUploadMessageForAndroid5 != null){mUploadMessageForAndroid5.onReceiveValue(null);mUploadMessageForAndroid5 = null;}}
}

这就是所需的权限,记得在AndroidManifest.xml中进行配置.  (这里不知道有没有遗漏)

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" /> <!-- 使用照相机权限 -->
<uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自动聚焦权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

当然这里面是有些缺陷的,例如没有运行时权限、适配Android6.0 - 7.0 。 Android 7.0 开始资源共享问题。

这边文章还有很大的优化、修改的地方的。

(因为国产手机中,一些厂商都是自家深度定制的Android 系统。

所以一些运行时权限是和Google发布的Android 运行时权限是存在一些出入的,在这方面的适配会有些复杂)

另外图片选择不是很建议用原生的,建议还是用第三方的图片选择框架。这就自己看自己的需求改了

Android WebView 选择图片并上传(调用相机拍照/相册/选择文件)相关推荐

  1. 微信小程序拍照视频上传php,微信小程序-拍照或选择图片并上传文件

    微信小程序-拍照或选择图片并上传文件 调用拍照API:https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html?t=201612 ...

  2. uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    前言 最近在使用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能. 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseI ...

  3. FileUpload选择图片并上传

    在上传按钮的事件里: //文件上传 protected void btn_Click(object sender, EventArgs e) { if (FileUpload1.HasFile)//判 ...

  4. 《微信小程序案例6》点击图片上传,从本地相册选择或打开摄像头拍摄上传照片

    点击一下相机图片实现上传本都相册图片或者打开摄像头拍照上传 使用微信小程序API里面的wx.chooseImage 实现点击并上传图片后把上传的图片放入上面的虚线框里面. 方法: 在wx.choose ...

  5. app头像上传vue_VUE上传头像,从相册选择、调用摄像头,ios适用transPath的转换

    HTML //这个图片是田字格,样式 //这是要上传的图片 //删除的图片 // 这个点击保存,是手机上选择好相片才会出来的 点击保存 立即申请 样式: #confrim{ width: 100%; ...

  6. 使用RecyclerView选择图片并上传

    先看效果图: 在项目中如果多处用到需要上传照片,每次都写重复的代码,未免冗余浪费时间,本文通过封装一个fragment,每次用时只需要在xml文件中写name就可以实现. 即:在当前需要上传图片Act ...

  7. uniapp选择图片裁剪,上传到服务器

    uni.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考plus.camera(opens new win ...

  8. MUI+HTML5+Plus 拍照或者相册选择图片并上传服务器

    引入文件 css:mui.min.css.app.css.iconfont.css.feedback-page.css.font-awesome.min.css js:jquery.js.common ...

  9. 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器

    最后更新17.01.20 一.首先这是HTML的代码 将要显示一张图片 二.然后这是JavaScript代码 var img_my = document.getElementById('my_img_ ...

  10. unity从本地选择图片并上传

    unity实现打开文件夹选择图片的两种方式: 一.引用System.Windows.Forms 此方法需要在unity的安装目录中找到System.Windows.Forms.dll文件并放在项目的P ...

最新文章

  1. 软件需求分析--三步走
  2. bzoj2154 Crash的数字表格
  3. crypto安装_CryptoPP库在Linux系统下的安装与测试
  4. html请求接口_python接口自动化测试 - 2.Django开发接口
  5. 计算机网络实验类型有哪些,北航研究生计算机网络实验_实验三 网络层实验
  6. 阿里巴巴常考面试题及汇总答案
  7. 新增成功到编制为空bug_36 个JS 面试题为你助力,让面试更有力(面试必读)
  8. 大数据技术有什么优势
  9. 用AVPlayer播放视频
  10. 人工智能深度学习数据集
  11. 在禁用UAC时无法激活此应用
  12. 什么是数据结构?是举一个例子,叙述逻辑结构、存储结构和运算三个方面的内容。
  13. qcqa是什么职位_QA和QC是什么意思?区别是什么?
  14. win10硬盘锁怎么解除_如何解锁BitLocker加密的Win10系统【图文教程】
  15. 多项式学习笔记[二](全网最详细!有图有代码有解释有例题有总结!)
  16. 高性能Nginx介绍(二)
  17. 小菜鸟Python历险记:(第二集)
  18. 白帽子讲web安全PDF完整版
  19. (附源码)计算机毕业设计ssm城市道路智能停车管理系统
  20. 【转载】2009年必看十大动漫游戏改编电影

热门文章

  1. 太阳能热水器系统设计
  2. 关于函数连续性的逐点定义
  3. 神仙项目,轻松上手了解前后端分离!
  4. 【计算机组成原理】使用VHDL语言设计一个二输入异或门
  5. 史上最详细的5-Why解说|优思学院
  6. 小游戏上传分数是怎么实现的_如何利用微信小游戏做公众号吸粉营销活动
  7. html视频设置自动播放下一个,在html5中,如何使用video标签让两个不同的视频文件按顺序自动播放?...
  8. 微信小程序之授权登录的实现(button按钮)
  9. CS相关经典书籍的书评
  10. 最小覆盖圆(smallest enclosing circle)算法 python 实现