android之 h5调用系统相机和相册并显示
来源:互联网 发布:js控制div display 编辑:程序博客网 时间:2024/05/21 07:51
先上html界面的代码,放在assets里面就可以了,我也不太会html,所以随便写了点
<!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; // 存储在本地的图片的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, 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); } }
来看效果图
阅读全文
0 0
- android之 h5调用系统相机和相册并显示
- Android调用系统相册和相机选择图片并显示在imageview中
- Android开发之调用相机拍照和调用系统相册
- android 调用系统相机和相册
- Android调用系统相机和相册
- Android调用系统相机和相册-填坑篇
- Android调用系统相机和相册
- Android调用系统相机和相册
- android调用系统相机和相册
- Android调用系统相机和相册-坑篇
- Android调用系统相机和相册
- Android 调用系统相机和相册
- Android调用系统相册和相机拍照
- 基础Android之调用相机和相册
- 调用系统相机和系统相册,并保存到沙盒中
- android中调用系统相机拍照并访问本地相册
- Android调用系统相机,相册,并设置为圆形图像
- 【Android】系统相机、相册获取照片并显示
- 健康和消费两大服务如何投,来听听长岭资本蒋晓冬怎么说丨投资人说
- python使用pymysql连接mysql数据库
- 全球“独角兽”企业版图:中国超欧洲 美国地位动摇
- 使用MentalRay烘培,实现Unity3d·HDR版LightMap
- 我使用过的Linux 命令
- android之 h5调用系统相机和相册并显示
- 刘强东晒新京东总部;人类首次发现引力波;iPhone X日产量扩至约25万台丨价值早报
- JavaScript中typeof的用法
- Python爬虫-爬取xixizhan.com站点的所有电影列表并写入文件和数据库mysql
- 解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
- Unity UGUI 检测按钮的按下与抬起
- Gauge中文文档(12)—怎么做?
- JS利用正则配合replace替换指定字符
- Android Studio出现Failed to open zip file问题的解决方法