Android中Webviw加载H5页面调用本地相机拍照并显示在H5页面上
来源:互联网 发布:centos 7网络配置 编辑:程序博客网 时间:2024/05/01 14:58
需求:用户点击拍摄,调取相机,拍照后,返回到H5页面,上传成功后,将照片加载到H5页面中。对于用户上传的照片,后台进行压缩,每张图片压缩到200kb左右即可,格式为png。
思路:首先找到WebView控件加载url地址,然后 mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Js(), “jsObj”);
然后
class Js {@JavascriptInterfacepublic void goAppCamera() {openCarcme();//打开相机}}
最后在onActivityResult中获取到Bitmap,将Bitmap转换成Base64之后再调用setPlatformType方法加载Url,话不多说直接上代码。
package camerademo.com.camerademo;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.support.annotation.Nullable;import android.util.Base64;import android.util.Log;import android.webkit.JavascriptInterface;import android.webkit.ValueCallback;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.WebViewClient;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;public class MainActivity extends Activity { private WebView mWebView; private ValueCallback<Uri> mUploadMessage; //表单的数据信息 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mWebView = (WebView) findViewById(R.id.web_view); mWebView.setWebChromeClient(new MyWebChromeClient()); mWebView.setWebViewClient(new MyWebViewClient(this)); mWebView.loadUrl("http://10.1.21.23:8080/view/demo/inputCamera.html"); mWebView.getSettings().setJavaScriptEnabled(true); //在Js类里实现javascript想调用的方法,"jsObj"就是这个接口的别名 mWebView.addJavascriptInterface(new Js(), "jsObj"); } private class MyWebChromeClient extends WebChromeClient { // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMessage = uploadMsg; } // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser(uploadMsg, ""); } // For Android > 4.1.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); } } private class MyWebViewClient extends WebViewClient { private Context mContext; public MyWebViewClient(Context context) { super(); mContext = context; } @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); } } class Js { @JavascriptInterface public void goAppCamera() { openCarcme(); } } /** * 打开相机 */ private void openCarcme() { Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } public void setPlatformType(final String result) { new Handler().postDelayed(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript: cameraResult('"+ result.toString() + "')"); } }, 1000); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 1 ) { //部分手机获取uri为空,则需要从bundle中获取Bitmap Uri uri = intent.getData(); if(uri == null){ Bundle bundle = intent.getExtras(); if (bundle != null) { Bitmap bitmap = (Bitmap) bundle.get("data"); //get bitmap Bitmap compressBitmap = compressImage(bitmap); Log.d("it520", "bitmapToBase64被调了..."); String str = bitmapToBase64(compressBitmap); setPlatformType(str); } }else { Bitmap bitmap = BitmapFactory.decodeFile(uri.getPath()); Bitmap compressBitmap = compressImage(bitmap); Log.d("it520", "else中的bitmapToBase64被调了..."); String str = bitmapToBase64(compressBitmap); setPlatformType(str); } } } /** * 图片压缩 * @param image * @return */ public Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中//因为获取到的ByteArrayOutputStream大小基本为50几kb,所以不用压缩,所以以下代码注释掉 // int options = 90;// while (baos.toByteArray().length / 1024 > 200) {// 循环判断如果压缩后图片是否大于200kb,大于继续压缩// baos.reset(); // 重置baos即清空baos// image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options,把压缩后的数据存放到baos中// options -= 10;// 每次都减少10// } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片 return bitmap; } // bitmap转base64 public static String bitmapToBase64(Bitmap bitmap) { String result = "data:image/png;base64,";//必须加上“data:image/png;base64”图片的数据格式H5才能识别出来 ByteArrayOutputStream bos = null; try { if (null != bitmap) { bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);// 将bitmap放入字节数组流中 bos.flush();// 将bos流缓存在内存中的数据全部输出,清空缓存 bos.close(); byte[] bitmapByte = bos.toByteArray(); result += Base64.encodeToString(bitmapByte, Base64.DEFAULT); } } catch (Exception e) { e.printStackTrace(); } finally { if (null != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } Log.d("it520", "result=" + result); Log.d("it520", "size=" + bos.toByteArray().length / 1024);//获取ByteArrayOutputStream的大小,单位kb, return result; } /** * base64转Bitmap * @param base64String * @return */ public static Bitmap base64ToBitmap(String base64String) { byte[] bytes = Base64.decode(base64String, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return bitmap; }}
附图为h5部分代码
阅读全文
0 0
- Android中Webviw加载H5页面调用本地相机拍照并显示在H5页面上
- H5页面上拉加载
- H5页面调用拍照上传图片
- android之 h5调用系统相机和相册并显示
- android调用H5显示加载中效果
- 在APP中嵌套H5页面,点击页面上的按钮调用app的组件方法
- h5页面调用百度地图获取当前位置并在地图上标注出来
- Android用webView加载h5的页面,h5获取本地的图库中的图片
- android调用系统相机拍照并保存在本地
- android调用系统相机拍照并保存在本地
- android调用系统相机拍照并保存在本地
- android中调用系统相机拍照并访问本地相册
- H5页面实现上拉加载更多
- WPF 加载H5页面
- Android中使用WebView加载H5页面的方法
- Android与js交互第二步,实现本地拍照选择相册,将图片传给h5页面
- android使用webview加载H5页面
- h5页面唤起本地APP
- torch.optim优化算法理解之optim.Adam()
- 利用springboot,mybatis和luncene整合创建博客系统(只给出全数据库搜索并显示在搜索页面)
- 无环有向图的最短路径和最长路径(权重任意)
- [FAQ17514][Recovery]Recovery mode FAQ搜寻指南
- 饿了么项目---12、父子组件、兄弟组件之间数据通信与事件派发(关于购物车添加按钮的动画)
- Android中Webviw加载H5页面调用本地相机拍照并显示在H5页面上
- 技术文章 | 前端图像处理指南
- 我们究竟应该如何学习编程
- ffmpeg推流到ossrs
- IE9 通过 HttpServletResponse.sendRedirect()跳转不过的问题
- golang开源项目列表
- 怎么从Linux服务器上下载超过4G的文件?
- java 打印佛祖保佑
- 如何在Android应用里对HTTP请求头部添加适当的User-Agent字段