android之 h5调用系统相机和相册并显示
2017-10-17 09:25
471 查看
先上html界面的代码,放在assets里面就可以了,我也不太会html,所以随便写了点
然后来看看java怎么做
主要是对webview进行操作
拍照和相册选择的弹窗
先检查是否有权限
收到照片的回调
回调webview
来看效果图
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>H5页面上传手机照片</title> </head> <body> <script> function previewFile1() { var img = document.getElementById("preview1"); // 仅限上传单张图片 var file =document.getElementById("demo1").files[0]; var text2 = document.getElementById("text2"); var reader = new FileReader(); reader.addEventListener("load", function () { img.src = reader.result; < 4000 span class="hljs-comment">// 存储在本地的图片的base64编码 }, false); if (file) { reader.readAsDataURL(file); } } function previewFile2() { var img2 = document.getElementById("preview2"); // 仅限上传单张图片 var file2 = document.getElementById("demo2").files[0]; var reader2 = new FileReader(); reader2.addEventListener("load", function () { img2.src = reader2.result; // 存储在本地的图片的base64编码 }, false); if (file2) { reader2.readAsDataURL(file2); } } </script> <form action=""> <p>图片1: <input type="file" id="demo1" name="uploadImg1" onchange="previewFile1()"/></p> <p>图片2: <input type="file" id="demo2" name="uploadImg2" onchange="previewFile2()"/></p> <img id="preview1" src="" width="100" height="100"/> <br> <img id="preview2" src="" width="100" height="100"/> </form> </body> </html>
然后来看看java怎么做
主要是对webview进行操作
public void initWebView() { WebView webview = (WebView) findViewById(R.id.act_certification_webview); WebSettings webSettings = webview.getSettings(); //设置WebView属性,能够执行Javascript脚本 webSettings.setJavaScriptEnabled(true); //设置可以访问文件 webSettings.setAllowFileAccess(true); //设置支持缩放 webSettings.setBuiltInZoomControls(true); webview.loadUrl("file:///android_asset/interact.html"); webview.setWebChromeClient(new WebChromeClient() { @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {//5.0+ showDialog(); mFilePathCallback = filePathCallback; return true; } //openFileChooser 方法是隐藏方法 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {// android 系统版本>4.1.1 showDialog(); mFilePathCallback = uploadMsg; } public void openFileChooser(ValueCallback<Uri> uploadMsg) {//android 系统版本<3.0 showDialog(); mFilePathCallback = uploadMsg; } public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {//android 系统版本3.0+ showDialog(); mFilePathCallback = uploadMsg; } }); }
拍照和相册选择的弹窗
private void showDialog() { NiceDialog .init() .setLayoutId(R.layout.dialog_choose_photo) .setConvertListener(new ViewConvertListener() { @Override public void convertView(ViewHolder holder, final BaseNiceDialog dialog) { holder.setOnClickListener(R.id.dialog_choose_photo_takePhoto, new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); autoObtainCameraPermission(1); } }); holder.setOnClickListener(R.id.dialog_choose_photo_gallery, new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); autoObtainStoragePermission(1); } }); } }) .setDimAmount(0.5f) .setShowBottom(false) .setAnimStyle(R.style.popwindow_center_style) .setMargin(30) .setOutCancel(true) .show(getSupportFragmentManager()); }
先检查是否有权限
public void autoObtainCameraPermission(int type) { this.type = type; if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { // ToastUtils.showToastCenter("您已经拒绝过一次"); } ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE); } else {//有权限直接调用系统相机拍照 if (CommonUtil.hasSdcard()) { imageUri = Uri.fromFile(fileUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) imageUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST); } else { ToastUtils.showToastCenter("设备没有SD卡!"); } } }
收到照片的回调
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == CODE_CAMERA_REQUEST) { // cropImageUri = Uri.fromFile(fileCropUri); // PhotoUtils.cropImageUri(this, imageUri, cropImageUri, 1, 1, output_X, output_Y, CODE_RESULT_REQUEST); Bitmap bitmapFromUri = PhotoUtils.getBitmapFromUri(imageUri, this); int bitmapDegree = getBitmapDegree(imageUri.getPath()); Bitmap bitmap = rotateBitmapByDegree(bitmapFromUri, bitmapDegree); if (bitmap == null) { showToastBottom("对不起,图片不正确!"); return; } try { File fileIcon = new File(Environment.getExternalStorageDirectory().getPath() + "/" + SystemClock.currentThreadTimeMillis() + "4.jpg"); saveBitmapToUri(bitmap, fileIcon.getAbsolutePath()); getbitmap(type, fileIcon.getPath(), bitmap); } catch (IOException e) { showToastBottom("图片压缩异常"); } } else if (CODE_GALLERY_REQUEST == requestCode) { if (hasSdcard()) { // cropImageUri = Uri.fromFile(fileCropUri); Uri newUri = Uri.parse(PhotoUtils.getPath(this, data.getData())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { newUri = FileProvider.getUriForFile(this, mContext.getPackageName() + ".fileprovider", new File(newUri.getPath())); } int bitmapDegree = getBitmapDegree(newUri.getPath()); Bitmap bitmapFromUri = PhotoUtils.getBitmapFromUri(newUri, this); if (bitmapFromUri == null) { showToastBottom("对不起,图片不正确!"); return; } Bitmap bitmap = rotateBitmapByDegree(bitmapFromUri, bitmapDegree); if (bitmap == null) { showToastBottom("对不起,图片不正确!"); return; } try { File fileIcon = new File(Environment.getExternalStorageDirectory().getPath() + "/" + SystemClock.currentThreadTimeMillis() + "4.jpg"); saveBitmapToUri(bitmap, fileIcon.getAbsolutePath()); getbitmap(type, fileIcon.getPath(), bitmap); } catch (IOException e) { showToastBottom("图片压缩异常"); } // PhotoUtils.cropImageUri(this, newUri, cropImageUri, 1 c9e8 , 1, output_X, output_Y, CODE_RESULT_REQUEST); } else { ToastUtils.showToastCenter("设备没有SD卡!"); } // } else if (CODE_RESULT_REQUEST == requestCode) { // Bitmap bitmap = PhotoUtils.getBitmapFromUri(cropImageUri, this); // if (bitmap != null && cropImageUri != null) { // //// getbitmap(type, cropImageUri, bitmap); // } } } }
/** * 读取图片的旋转的角度 * * @param path 图片绝对路径 * @return 图片的旋转角度 */ private int getBitmapDegree(String path) { int degree = 0; try { // 从指定路径下读取图片,并获取其EXIF信息 ExifInterface exifInterface = new ExifInterface(path); // 获取图片的旋转信息 int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } /** * 将图片按照某个角度进行旋转 * * @param bm 需要旋转的图片 * @param degree 旋转角度 * @return 旋转后的图片 */ public Bitmap rotateBitmapByDegree(Bitmap bm, int degree) { Bitmap returnBm = null; // 根据旋转角度,生成旋转矩阵 Matrix matrix = new Matrix(); matrix.postRotate(degree); try { // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); } catch (OutOfMemoryError e) { } if (returnBm == null) { returnBm = bm; } if (bm != returnBm) { bm.recycle(); } return returnBm; } /** * 把压缩后的bitmap转化为file; * * @param path;压缩后的file路径 */ private boolean saveBitmapToUri(Bitmap bitmap, String path) throws IOException { File file = new File(path); if (file.exists()) { if (file.delete()) { if (!file.createNewFile()) { return false; } } } BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(file)); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);//100为压缩的品质,100为100% outStream.flush(); outStream.close(); return true; }
回调webview
@Override protected void getbitmap(int type, String imagePath, Bitmap bitmap) { Uri uri = Uri.fromFile(new File(imagePath)); if (Build.VERSION.SDK_INT > 18) { mFilePathCallback.onReceiveValue(new Uri[]{uri}); } else { mFilePathCallback.onReceiveValue(uri); } }
来看效果图
相关文章推荐
- Android 调用系统相机拍照并且显示在相册中,以及中间可能会遇到的一些问题的解决
- Android调用系统相册和相机选择图片并显示在imageview中
- Android调用系统相册和相机选择图片显示在界面
- 解决Android调用系统相机拍照后相片无法在相册中显示问题
- Android 拍照以及一些常用的处理,例如将图片显示到相册(包含了安卓系统6.0以上调用相机的处理)
- Android 调用系统相机拍照保存以及调用系统相册的方法
- android--调用系统相机,显示图片
- iOS调用系统相册、相机 显示中文标题
- android调用系统相机与系统相册
- iOS调用系统相册、相机 显示中文标题
- iOS调用系统相册、相机 显示中文标题
- Android图片系列(1)-------调用系统相册与相机获取图片
- iOS调用系统相册、相机 显示中文标题
- iOS调用系统相册、相机 显示中文标题
- android调用系统相机、调用系统相册,调用系统图片裁剪报错的解决方案
- Android调用系统相册和系统相机拍照
- iOS开发--调用系统相册、相机显示中文title
- Android 调用系统相机拍照保存以及调用系统相册的方法
- Android 调用系统相机以及相册源码
- Android 调用系统相机拍照保存以及调用系统相册的方法