在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器

最近做的一个项目中,有这样一个要求,在浏览器中调用系统的拍照功能或者选择文件,然后将文件上传到服务器,类似修改头像。        简单而言,就是在一个html页面中有这样一段代码 <input class="filePrew" type="file" capture="camera" accept="image/*" name="image">

刚开始的时候,没有感觉很难的,因为在UC浏览器、系统自带的浏览器中都可以进行拍照/文件管理器选择,可是在自己所写的Activity中却不行。后来实在是没有思路了,就在网上找了一下,发现要        实现这种功能,都是在webview的WebChromeClient中覆盖掉openFileChooser方法,注意openFileChooser方法在WebChromeClient中有@hide标记。这里只管重写即可,下面将主要代码贴出来,做个记录

[java] view
plain
copy

  1. private ValueCallback<Uri> mUploadFile;
  2. /**拍照/选择文件请求码*/
  3. private static final int REQUEST_UPLOAD_FILE_CODE = 12343;
  4. private void setWebChromeClient()
  5. {
  6. if (null != mMainWebView)
  7. {
  8. mMainWebView.setWebChromeClient(new WebChromeClient()
  9. {
  10. // Andorid 4.1+
  11. public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)
  12. {
  13. openFileChooser(uploadFile);
  14. }
  15. // Andorid 3.0 +
  16. public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType)
  17. {
  18. openFileChooser(uploadFile);
  19. }
  20. // Android 3.0
  21. public void openFileChooser(ValueCallback<Uri> uploadFile)
  22. {
  23. // Toast.makeText(WebviewActivity.this, "上传文件/图片",Toast.LENGTH_SHORT).show();
  24. mUploadFile = uploadFile;
  25. startActivityForResult(Intent.createChooser(createCameraIntent(), "Image Browser"), REQUEST_UPLOAD_FILE_CODE);
  26. }
  27. });
  28. }
  29. }
  30. private Intent createCameraIntent()
  31. {
  32. Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//拍照
  33. //=======================================================
  34. Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);//选择图片文件
  35. imageIntent.setType("image/*");
  36. //=======================================================
  37. return cameraIntent;
  38. }
  39. //最后在OnActivityResult中接受返回的结果
  40. protected void onActivityResult(int requestCode, int resultCode, Intent data)
  41. {
  42. if (requestCode == REQUEST_UPLOAD_FILE_CODE && resultCode == RESULT_OK)
  43. {
  44. if (null == mUploadFile)
  45. {
  46. return;
  47. }
  48. Uri result = (null == data) ? null : data.getData();
  49. if (null != result)
  50. {
  51. ContentResolver resolver = this.getContentResolver();
  52. String[] columns = { MediaStore.Images.Media.DATA };
  53. Cursor cursor = resolver.query(result, columns, null, null, null);
  54. cursor.moveToFirst();
  55. int columnIndex = cursor.getColumnIndex(columns[0]);
  56. String imgPath = cursor.getString(columnIndex);
  57. System.out.println("imgPath = " + imgPath);
  58. if (null == imgPath)
  59. {
  60. return;
  61. }
  62. File file = new File(imgPath);
  63. //将图片处理成大小符合要求的文件
  64. result = Uri.fromFile(handleFile(file));
  65. mUploadFile.onReceiveValue(result);
  66. mUploadFile = null;
  67. }
  68. }
  69. super.onActivityResult(requestCode, resultCode, data);
  70. }
  71. /**处理拍照/选择的文件*/
  72. private File handleFile(File file)
  73. {
  74. DisplayMetrics dMetrics = getResources().getDisplayMetrics();
  75. BitmapFactory.Options options = new Options();
  76. options.inJustDecodeBounds = true;
  77. BitmapFactory.decodeFile(file.getAbsolutePath(), options);
  78. int imageWidth = options.outWidth;
  79. int imageHeight = options.outHeight;
  80. System.out.println("  imageWidth = " + imageWidth + " imageHeight = " + imageHeight);
  81. int widthSample = (int) (imageWidth / (dMetrics.density * 90));
  82. int heightSample = (int) (imageHeight / (dMetrics.density * 90));
  83. System.out.println("widthSample = " + widthSample + " heightSample = " + heightSample);
  84. options.inSampleSize = widthSample < heightSample ? heightSample : widthSample;
  85. options.inJustDecodeBounds = false;
  86. Bitmap newBitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
  87. System.out.println("newBitmap.size = " + newBitmap.getRowBytes() * newBitmap.getHeight());
  88. File handleFile = new File(file.getParentFile(), "upload.png");
  89. try
  90. {
  91. if (newBitmap.compress(CompressFormat.PNG, 50, new FileOutputStream(handleFile)))
  92. {
  93. System.out.println("保存图片成功");
  94. }
  95. }
  96. catch (FileNotFoundException e)
  97. {
  98. e.printStackTrace();
  99. }
  100. return handleFile;
  101. }

这样就可以在WebView中上传文件了。记得要添加相应的权限!  
       参考:http://developer.android.com/about/versions/android-3.0.html

http://blog.sina.com.cn/s/blog_5749ead90101clrn.html

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/sjwudhwhhw/p/10298394.html

时间: 2024-11-07 08:31:40

在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器的相关文章

调用相机,选择图片上传,带预览功能、图片压缩、相机文字设置、

摘要 iOS调用相机,iOS调用相册,保存至应用程序沙盒,高保真压缩图片,并有点击放大预览,再次点击缩回至原大小,带动画效果,附源码下载地址. Xcode版本4.5.1 类库ios6.0 IOS调用相机 图片预览 图片上传 压缩图片 模拟器添加图片 目录[-] 判断是否支持相机,跳转到相机或相册界面 七.保存图片 高保真压缩图片方法 八.实现点击图片预览功能,滑动放大缩小,带动画 ps:模拟器添加图片 源码下载地址: 一.新建工程 二.拖控件,创建映射 三.在.h中加入delegate ? 1

iOS UIPickerController 调用相机,选择图片上传,带预览功能

在.h中加入delegate @interface ViewController : UIViewController<UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate> //实现按钮事件 -(IBAction)chooseImage:(id)sender { UIActionSheet *sheet; <p> // 判断是否支持相机 </p> if(

iOS学习:调用相机,选择图片上传,带预览功能

一.新建工程 <ignore_js_op> 二.拖控件,创建映射 <ignore_js_op> 三.在.h中加入delegate @interface ViewController : UIViewController 复制代码 四.实现按钮事件 -(IBAction)chooseImage:(id)sender { UIActionSheet *sheet; // 判断是否支持相机 if([UIImagePickerController isSourceTypeAvailable

【分享】兼容ie6-9和现代浏览器以及ios,android,pad等触屏设备的异步文件上传插件

核心代码 /** * 该插件用于兼容ie6-7-8-9及现代浏览器的异步上传文件. * 请注意,在ie6-7-8-9上面的原理是: * 新添加一个表单和一个iframe,然后每次选择都将file输入框复制到该表单上面,然后submit整个表单,这样就可以实现类似ajax提交文件的效果, * 但是有一点是没办法处理的,就是在客户端预览图片及判断文件大小.现代浏览器则可以. */ var AjaxFileInput=function(opts){ var settings={ container:"

Android文件上传-本地+服务器一条龙分析

本地: 先看下项目结构 MainActivity.java package com.huxq.uploadexample; import java.io.File; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Environment; import

微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传

1.index.wxml 1 <!--index.wxml--> 2 <button style="margin:30rpx;" bindtap="chooseimage">获取图片</button> 3 <image src="{{tempFilePaths }}" mode="aspecFill" style="width: 100%; height: 450rpx&qu

让Android的WebView支持html里面的文件上传

默认情况下,Android的webview是不支持<input type=file>的,点击没有任何反应,如果希望点击上传,弹出选择文件.图片的窗口,那就需要自定义一个WebChromeClient public class MyChromeClient extends WebChromeClient { public ValueCallback<Uri> UploadMsg; public ValueCallback<Uri[]> UploadMsg2; privat

Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案

一.Crontab -e 加入输出Log */1 * * * * /qiwen_list/upload_to_hdfs.sh > /qiwen_list/mapred.log 2>&1 二.查看Log发现,找不到Hadoop 三.脚本中指定Hadoop完整路径 #!/bin/sh#upload list to hdfs yesterday=`date --date='1 day ago' +%Y%m%d` echo $yesterday/home/hadoop/bin/hadoop f

Android文件上传至服务器

项目演示及讲解 优酷  http://v.youku.com/v_show/id_XODk5NjkwOTg4.html 爱奇艺  http://www.iqiyi.com/w_19rs1v2m15.html#vfrm=8-7-0-1 土豆  http://www.tudou.com/programs/view/fv0H93IHfhM 项目下载 1.手机端选择文件上传至服务器端 http://download.csdn.net/detail/u010134178/8457679 2.手机端拍照上传