Android实现相机拍照和相册选择以及图片裁剪适配Android10以上
之前写的一个工具类,在华为手机Android版本12上无法返回图片路径,提示不是一个文件或是文件不存在。
所以更改此工具类如下:
package com.suoer.comeonhealth.laibadoctorandroid.utils;import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;public class ImageSetUtils {public static final int CODE_SETHDIMG_ALNUM = 572;public static final int CODE_SETHDIMG_CAM = 231;public static final int CODE_CROP_IMG = 318;public File camImgFile = null;public File cropImgFile = null;public void gotoCam(Activity context) {//获取当前系统的android版本号int currentApiVersion = android.os.Build.VERSION.SDK_INT;SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());String str = dateFormat.format(new Date(System.currentTimeMillis()));//设置保存拍摄照片路径(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg)//路径默认,若修改则不能保存照片camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/LaibaDoctor_img_" + str + ".jpg");try {if (camImgFile.exists()) {camImgFile.delete();}camImgFile.createNewFile();} catch (IOException e) {e.printStackTrace();}Uri outputImgUriFromCam;if (currentApiVersion < 24) {outputImgUriFromCam = Uri.fromFile(camImgFile);} else {ContentValues contentValues = new ContentValues(1);contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath());outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);}//跳转到照相机拍照Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam);context.startActivityForResult(it, CODE_SETHDIMG_CAM);}public void gotoAlbum(Activity context) {Intent it = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);(context).startActivityForResult(it, CODE_SETHDIMG_ALNUM);}/*** 裁剪图片* @param context 上下文* @param isFromCam 是否来自于相机* @param isSetHd 是否是头像* @param data 图片返回的uri* @param fileName 路径名称*/public void cropImg(Activity context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) {File inputFile;if (isFromCam) {inputFile = camImgFile;} else {inputFile = new File(getRealPathFromURI(context, data.getData()));}//设置保存路径名称cropImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),fileName+String.valueOf(System.currentTimeMillis()) + ".jpg");try {if (cropImgFile.exists()) {cropImgFile.delete();}cropImgFile.createNewFile();} catch (IOException e) {e.printStackTrace();}WindowManager manager = context.getWindowManager();DisplayMetrics outMetrics = new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);Intent it = new Intent("com.android.camera.action.CROP");it.setDataAndType(getImageContentUri(context, inputFile), "image/jpg");it.putExtra("output", Uri.fromFile(cropImgFile));it.putExtra("crop", "true");if (isSetHd) {// 裁剪框比例it.putExtra("aspectX", 1);it.putExtra("aspectY", 1);// 输出图片大小it.putExtra("outputX", 240);it.putExtra("outputY", 240);} else {// 裁剪框比例it.putExtra("aspectX", 3);it.putExtra("aspectY", 2);// 输出图片大小it.putExtra("outputX", 600);it.putExtra("outputY", 400);}// 返回格式it.putExtra("outputFormat", "JPEG");(context).startActivityForResult(it, CODE_CROP_IMG);}public String getRealPathFromURI(Activity context, Uri uri) {String[] filePathColumn = {MediaStore.Images.Media.DATA};Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);cursor.moveToFirst();int columnIndex = cursor.getColumnIndex(filePathColumn[0]);String picturePath = cursor.getString(columnIndex);cursor.close();return picturePath;}public Uri getImageContentUri(Activity context, File imageFile) {String filePath = imageFile.getAbsolutePath();Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null);if (cursor != null && cursor.moveToFirst()) {int values1 = cursor.getInt(cursor.getColumnIndex("_id"));Uri baseUri = Uri.parse("content://media/external/images/media");return Uri.withAppendedPath(baseUri, "" + values1);} else if (imageFile.exists()) {ContentValues values = new ContentValues();values.put("_data", filePath);return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {return null;}}public static String encodebase64(Bitmap bitmap) {ByteArrayOutputStream baos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);byte[] bytes = baos.toByteArray();return new String(Base64.encode(bytes, Base64.DEFAULT));}public void refreshAlbum(Context context, String path) {context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path)));}public File getImg(Activity context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) {File inputFile = null;try {if (isFromCam) {inputFile = camImgFile;} else {inputFile = new File(getRealPathFromURI(context, data.getData()));}} catch (Exception e) {e.printStackTrace();}return inputFile;}
}
此工具类的使用
@NeedsPermission({Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE})public void takePicture() {if (imageSetUtils == null) {imageSetUtils = new ImageSetUtils();}imageSetUtils.gotoCam(this);}@NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE})public void gotoAlbum() {if (imageSetUtils == null) {imageSetUtils = new ImageSetUtils();}imageSetUtils.gotoAlbum(this);}
回调
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && requestCode == CODE_SETHDIMG_ALNUM) {//相册数据返回imageSetUtils.cropImg(this, false, true, data, "image_hd");//裁剪} else if (resultCode == RESULT_OK && requestCode == CODE_SETHDIMG_CAM) {//相机拍照返回imageSetUtils.cropImg(this, true, true, null, "image_hd");//裁剪imageSetUtils.refreshAlbum(mContext, imageSetUtils.camImgFile.getPath());//刷新相册} else if (resultCode == RESULT_OK && requestCode == CODE_CROP_IMG) {//裁剪图片返回headimgurl = imageSetUtils.cropImgFile.getPath();try {ConfigManager.getInstance().getImageLoader().loadCircleImage(icon_ImageView, headimgurl, R.mipmap.info_image_portrait, R.mipmap.info_image_portrait);//展示头像} catch (Exception e) {e.printStackTrace();}}
}
Android实现相机拍照和相册选择以及图片裁剪适配Android10以上相关推荐
- Flutter实现相机拍照和相册选择
Flutter实现相机拍照和相册选择 添加image_picker依赖:https://pub.dev/packages/image_picker/install 给权限(安卓) // 写入文件权限& ...
- 兼容Android 11 相机拍照,从相册中选择,裁剪图片
由于android 11对存储空间进行了更新,导致无法进入裁剪或者裁剪后无法保存,返回路径等问题. android 10以下可以参考:android 相机拍照,从相册中选择,裁剪图片 前面部分和之前的 ...
- h5(网页) 调用相机拍照和相册,实现图片上传功能
情景描述: 一个h5或者网页中需要上传图片功能,并且这个功能可以选择本地的图片或者拍照上传: 实现方法: 我们在网页中是可以直接调用手机的相机或者上传本地图片的,也就是说,我们是有使用本地图片文件和 ...
- Android 中拍照、相册选择、裁剪照片
一个多月没总结知识点了,差点连博客账号都忘了...好了,步入正题,在 Android 中调用摄像头拍照获取图片或者是从相册中选取图片是很常见的功能,比如某些 APP 上传头像的功能就是一个例子. ** ...
- Android 拍照和相册选择
前几天一直在想写一个简单干净的关于Android 拍照和相册选择的dome,直到今天才有时间去写,下面是图片介绍,资源代码会有上传!供初学者学习指教(代码是Android studio) 1.控件 0 ...
- android拍照所需的权限,eclipse --- Android拍照,相册选择图片以及Android6.0权限管理...
[实例简介] eclipse --- Android拍照,相册选择图片以及Android6.0权限管理 [实例截图] [核心代码] camreainandroidm └── camreainandro ...
- Flutter自定义相机,Flutter相册选择照片
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. github? 测试源码在这里 百度同步 CSDN 网易云课堂教程 掘金 知乎 Flutter系列文章 头条同步 实际项目开发中,谷歌 ...
- MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题
Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题 直接上代码 首先添加拍照需要的权限 <uses-permission android:name="andr ...
- android 调用相机拍照。适配到 Android 10
Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者 提 Bug 标签: android ...
最新文章
- 在CentOS 6.9 x86_64上搭建全功能的OpenResty 1.13.6.1笔记
- CSS 文字,边框实现从左至右颜色渐变
- go 调用dll char*传输
- 「Ubuntu」Problem executing scripts APT::Update::Post-Invoke-Success ‘if /usr/bin/test -w /var/lib
- 给Sublime text2安装Zen Coding插件
- QImage对一般图像的处理
- path的图片下拉效果
- VB连接ACCESS数据库,使用 LIKE 通配符问题
- Github上传代码及解决main主分支问题
- 怎么定位html的坐标,css怎么定位图片的位置?
- 电路图:LM3886低音炮电路
- 《Android 4高级编程(第3版)》(完整书签).pdf
- 毕业两年,我完成了月薪3k到月薪13k的转变
- ker矩阵是什么意思_变换矩阵与投影
- redmine2.0 + mongrel
- 移动办公oa管理软件的五大选择要素有哪些?
- 滴滴助力2020中国开源年会暨阿帕奇中国路演
- ES系统封装教程 高级进阶版 提供Wind7,xp系统下载 (by 星空武哥)
- Silverlight4Beta之RichTextArea
- 偏差(Bias)与方差(Variance)详解