Android拍照和裁剪管理
Android 开发过程中相机拍照和裁剪上传图片功能几乎成了每个APP的必备功能,每次复制粘贴都有好多的代码,今天对拍照和裁剪功能进行整理形成工具类,以后直接调用几行代码快速集成。
[TOC]
1、本文设计到的主页功能点
- 相机拍照
- 图片裁剪,可设置裁剪比例
- 6.0 以上权限问题
- 7.0 以上 Uri 问题
- 重复拍照产出是垃圾文件
2、拍照和裁剪的工具类
/**
* 相机拍照,裁剪
* Created by mtf on 2019/4/26.
*/
public class TakePictureManager {
private Activity activity;
private File tempFile; // 临时存储照片
private Uri outImageUri;// 相机拍照图片保存地址
private static final int REQUEST_TAKE_PIC_CODE = 1000; // 请求拍照
private static final int REQUEST_CROP_PICKER_CODE = 1001; // 裁剪照片
private static final int CAMERA_PERMISSIONS_REQUEST_CODE = 1005; // 申请相机权限
private boolean isCrop = false; // 是否需要照片裁剪,默认不需要裁剪
private boolean aspectXY = false;//设置是否可以修改裁剪框比例,默认不可以修改
private int aspectX = 100;
private int aspectY = 101;//经过测试如果裁剪框比例设置成1:1,部分手机出现裁剪框变成圆形而不是正方形
private int outputX = 600;
private int outputY = 600;
PicturePathListner pictureSelectListner;//选择之后照片的回调监听
public TakePictureManager(Activity activity) {
this.activity = activity;
}
public TakePictureManager(Activity activity, PicturePathListner pictureSelectListner) {
this.activity = activity;
this.pictureSelectListner = pictureSelectListner;
}
public void setPictureSelectListner(PicturePathListner pictureSelectListner) {
this.pictureSelectListner = pictureSelectListner;
}
/**
* 照片回调处理
*
* @param requestCode
* @param resultCode
* @param data
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case REQUEST_TAKE_PIC_CODE:
if (isCrop) {
cropPicture();
} else {
this.pictureSelectListner.onPictureSelect(tempFile.getAbsolutePath());// 这里一定不可以用outImageUri.getPath(),因为uri保存的可能不是真实的照片地址,
}
break;
case REQUEST_CROP_PICKER_CODE:
this.pictureSelectListner.onPictureSelect(tempFile.getAbsolutePath());
break;
}
}
}
/**
* 调用摄像头拍照
*/
public void takePhoto() {
if (CameraPermission()) { // 判断相机权限
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断相机是否可以打开
if (cameraIntent.resolveActivity(activity.getPackageManager()) != null) {
tempFile = FileUtils.getNewFile();
outImageUri = getUriForFile(tempFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outImageUri);
activity.startActivityForResult(cameraIntent, REQUEST_TAKE_PIC_CODE);
}
}
}
/**
* 裁剪照片
*/
private void cropPicture() {
Intent intent = new Intent("com.android.camera.action.CROP");
// 设置需要裁剪的图片地址
intent.setDataAndType(outImageUri, "image/*");
intent.putExtra("crop", "true"); // 这里必须设置为true拍照之后才会进行裁剪操作
// 1.宽高和比例都不设置时,裁剪框可以自行调整(比例和大小都可以随意调整)
// 2.只设置裁剪框宽高比(aspect)后,裁剪框比例固定不可调整,只能调整大小
// 3.裁剪后生成图片宽高(output)的设置和裁剪框无关,只决定最终生成图片大小
// 4.裁剪框宽高比例(aspect)可以和裁剪后生成图片比例(output)不同,此时, 会以裁剪框的宽为准,
// 按照裁剪宽高比例生成一个图片,该图和框选部分可能不同,不同的情况可能是截取框选的一部分,
// 也可能超出框选部分, 向下延伸补足
// aspectX aspectY 是裁剪框宽高的比例
if (!aspectXY) {
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
}
// outputX outputY 是裁剪后生成图片的宽高输出大小
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
// return-data为true时,会直接返回bitmap数据,但是大图裁剪时会出现问题,推荐下面为false时的方式
// return-data为false时,不会返回bitmap,但需要指定一个MediaStore.EXTRA_OUTPUT保存图片uri
intent.putExtra("return-data", false);
// return-data为false时,设置输出的uri图片地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, outImageUri);
// 图片输出格式
//intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//不加会出现无法加载此图片的错误
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);// 这两句是在7.0以上版本当targeVersion大于23时需要
activity.startActivityForResult(intent, REQUEST_CROP_PICKER_CODE);
}
/**
* 对Uri 进行处理
*
* @param file 返回 兼容处理后的 Uri
* @return
*/
private Uri getUriForFile(File file) {
Uri fileUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri
fileUri = FileProvider.getUriForFile(activity, "com.mtf.picturemanage.provider", file); //一定要和 AndroidManifest.xml 中的设置的名字一样
} else {
fileUri = Uri.fromFile(file);
}
return fileUri;
}
/**
* 判断相机权限,如果没有权限就帮忙申请了
*/
private Boolean CameraPermission() {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) {
Toast.makeText(activity, "您已经拒绝过一次,再次拒绝真的不可以拍照啦", Toast.LENGTH_LONG);
}
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE);
return false;
} else {//有权限直接调用系统相机拍照
return true;
}
}
/**
* 申请相机权限的回调处理
*
* @param requestCode
* @param permissions
* @param grantResults
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case CAMERA_PERMISSIONS_REQUEST_CODE: {//调用系统相机申请拍照权限回调
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
takePhoto();
} else {
Toast.makeText(activity, "请您允许打开相机!!", Toast.LENGTH_LONG);
}
break;
}
}
}
/**
* 设置照片是否支持裁剪,默认为 false 不支持裁剪
*
* @param crop
* @return
*/
public TakePictureManager setCrop(boolean crop) {
isCrop = crop;
return this;
}
/**
* 设置是否可以改变裁剪框的宽高比,默认为 false 不支持修改宽高比例
*
* @param aspectXY
* @return
*/
public TakePictureManager setAspectXY(boolean aspectXY) {
this.aspectXY = aspectXY;
return this;
}
/**
* 设置裁剪框的宽高比例,默认为1*1
*
* @param aspectX
* @param aspectY
* @return
*/
public TakePictureManager setAspectXY(int aspectX, int aspectY) {
this.aspectX = aspectX;
this.aspectY = aspectY;
return this;
}
/**
* 设置裁剪后图片的输出大小,默认为1000*1000
*
* @param outputX
* @param outputY
* @return
*/
public TakePictureManager setOutputXY(int outputX, int outputY) {
this.outputX = outputX;
this.outputY = outputY;
return this;
}
}
public interface PicturePathListner {
void onPictureSelect(String imagePath);//返回图片的路径
}
3、文件管理类
/**
* 文件管理类
*
* Created by mtf on 2019/4/26.
*/
public class FileUtils {
/**
* 拍照缓存地址
*/
public static final String TAKE_PIC_CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/picturemanage";
public static File getNewFile() {
File dir = new File(TAKE_PIC_CACHE_PATH);
if (!dir.exists()) {
dir.mkdir();
}
File file = new File(dir, System.currentTimeMillis() + ".jpg");//
return file;
}
/**
* 删除单个文件
*
* @param filePath 被删除文件的文件名
* @return 文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String filePath) {
File file = new File(filePath);
if (file.isFile() && file.exists()) {
return file.delete();
}
return false;
}
/**
* 删除文件夹以及目录下的文件
*
* @param filePath 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String filePath) {
boolean flag = false;
try {
// 如果filePath不以文件分隔符结尾,自动添加文件分隔符
if (!filePath.endsWith(File.separator)) {
filePath = filePath + File.separator;
}
File dirFile = new File(filePath);
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
flag = true;
File[] files = dirFile.listFiles();
// 遍历删除文件夹下的所有文件(包括子目录)
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
// 删除子文件
flag = deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
} else {
// 删除子目录
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag)
break;
}
}
if (!flag)
return false;
// 删除当前空目录
return dirFile.delete();
} catch (Exception e) {
}
return false;
}
/**
* 删除文件夹下的文件
*
* @param filePath 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectoryFile(String filePath, Context context) {
boolean flag = false;
try {
// 如果filePath不以文件分隔符结尾,自动添加文件分隔符
if (!filePath.endsWith(File.separator)) {
filePath = filePath + File.separator;
}
File dirFile = new File(filePath);
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
flag = true;
File[] files = dirFile.listFiles();
if (files.length == 0) {
return false;
} else {
// 遍历删除文件夹下的所有文件(包括子目录)
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
// 删除子文件
flag = deleteFile(files[i].getAbsolutePath());
deletePic(files[i].getAbsolutePath(),context);
if (!flag)
break;
} else {
// 删除子目录
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag)
break;
}
}
}
} catch (Exception e) {
}
if (!flag)
return false;
return flag;
}
/**
* 根据路径删除指定的目录或文件,无论存在与否
*
* @param filePath 要删除的目录或文件
* @return 删除成功返回 true,否则返回 false。
*/
public static boolean DeleteFolder(String filePath) {
File file = new File(filePath);
if (!file.exists()) {
return false;
} else {
if (file.isFile()) {
// 为文件时调用删除文件方法
return deleteFile(filePath);
} else {
// 为目录时调用删除目录方法
return deleteDirectory(filePath);
}
}
}
private static void deletePic(String path, Context context) {
if (!TextUtils.isEmpty(path)) {
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = context.getContentResolver();
String url = MediaStore.Images.Media.DATA + "='" + path + "'";
//删除图片
contentResolver.delete(uri, url, null);
}
}
}
4、图片处理类
/**
* 图片裁剪压缩工具
* Created by mtf on 2019/4/26.
*/
public class ImageUtil {
/**
* 根据路径获得图片信息并按比例压缩,返回bitmap
*/
public static Bitmap getSmallBitmap(String filePath, int width, int height) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;// 只解析图片边沿,获取宽高
BitmapFactory.decodeFile(filePath, options);
if (width == 0) {
width = options.outWidth;
height = options.outHeight;
}
// 计算缩放比
options.inSampleSize = calculateInSampleSize(options, width, height);
// 完整解析图片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
/**
* 计算缩放比
*
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
/**
* 质量压缩
*
* @param image
* @param size
* @param imageType
* @return
*/
public static byte[] compressImage(Bitmap image, int size, String imageType) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (imageType.equalsIgnoreCase("png")) {
image.compress(Bitmap.CompressFormat.PNG, 100, baos);
} else {
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
}
int options = 100;
while (baos.toByteArray().length / 1024 > size) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();// 重置baos即清空baos
if (imageType.equalsIgnoreCase("png")) {
image.compress(Bitmap.CompressFormat.PNG, options, baos);
} else {
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
options -= 10;// 每次都减少10
}
return baos.toByteArray();
} catch (Exception e) {
return null;
}
}
public static String getImagePath(Context context, Uri uri, String selection) {
String path = null;
// 通过Uri和selection来获取真实的图片路径
Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
public static String getFilePathByUri(Context context, Uri uri) {
String imagePath = null;
if (context == null || uri == null) {
return imagePath;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document类型的Uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; // 解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(context, contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(context, uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
} else {
if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(context, uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
}
return imagePath;
}
}
5、图片管理类
/**
* 图片裁剪压缩工具
* Created by mtf on 2019/4/26.
*/
public class ImageUtil {
/**
* 根据路径获得图片信息并按比例压缩,返回bitmap
*/
public static Bitmap getSmallBitmap(String filePath, int width, int height) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;// 只解析图片边沿,获取宽高
BitmapFactory.decodeFile(filePath, options);
if (width == 0) {
width = options.outWidth;
height = options.outHeight;
}
// 计算缩放比
options.inSampleSize = calculateInSampleSize(options, width, height);
// 完整解析图片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
/**
* 计算缩放比
*
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
/**
* 质量压缩
*
* @param image
* @param size
* @param imageType
* @return
*/
public static byte[] compressImage(Bitmap image, int size, String imageType) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (imageType.equalsIgnoreCase("png")) {
image.compress(Bitmap.CompressFormat.PNG, 100, baos);
} else {
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
}
int options = 100;
while (baos.toByteArray().length / 1024 > size) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();// 重置baos即清空baos
if (imageType.equalsIgnoreCase("png")) {
image.compress(Bitmap.CompressFormat.PNG, options, baos);
} else {
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
options -= 10;// 每次都减少10
}
return baos.toByteArray();
} catch (Exception e) {
return null;
}
}
public static String getImagePath(Context context, Uri uri, String selection) {
String path = null;
// 通过Uri和selection来获取真实的图片路径
Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
public static String getFilePathByUri(Context context, Uri uri) {
String imagePath = null;
if (context == null || uri == null) {
return imagePath;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document类型的Uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; // 解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(context, contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(context, uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
} else {
if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(context, uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
}
return imagePath;
}
}
6、7.0以上Provider设置
1.在AndroidManifest.xml中声明一个条目
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mtf.picturemanage">
<uses-feature android:name="android.hardware.camera" />
<!--相机权限-->
<uses-permission android:name="android.permission.CAMERA" />
<!--写入SD卡的权限:保存相机拍照后的照片-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--读取SD卡的权限:打开相册选取图片所必须的权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
...>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mtf.picturemanage.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
</application>
</manifest>
2、指定想分享的目录。在res目录下新建一个xml目录,在xml目录下面新建一个xml文件。我新建的文件名叫filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 注意 name 的名称设置不可以相同,否则会报错-->
<!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/DCIM/camerademo目录-->
<external-path name="hm_DCIM" path="DCIM/camera" />
<!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/Pictures/camerademo目录-->
<external-path name="hm_Pictures" path="Pictures/camera" />
<!--代表app 私有的存储区域 Context.getFilesDir()目录下的images目录 /data/user/0/com.hm.camerademo/files/images-->
<files-path name="hm_private_files" path="images" />
<!--代表app 私有的存储区域 Context.getCacheDir()目录下的images目录 /data/user/0/com.hm.camerademo/cache/images-->
<cache-path name="hm_private_cache" path="images" />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)目录下的Pictures目录-->
<!--/storage/emulated/0/Android/data/com.hm.camerademo/files/Pictures-->
<external-files-path name="hm_external_files" path="." />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的images目录-->
<!--/storage/emulated/0/Android/data/com.hm.camerademo/cache/images-->
<external-cache-path name="hm_external_cache" path="." />
<root-path name="honjane" path="" />
</paths>
7、简单使用实例
public class MainActivity extends AppCompatActivity {
private Button btCarmera;
private ImageView ivPhoto;
TakePictureManager selectPictureManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btCarmera = findViewById(R.id.bt_carmera);
ivPhoto = findViewById(R.id.iv_photo);
selectPictureManager = new TakePictureManager(this)
.setCrop(true);//设置是否需要裁剪,默认不裁剪
//点击按钮进行拍照
btCarmera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectPictureManager.takePhoto();
}
});
selectPictureManager.setPictureSelectListner(new PicturePathListner() {
@Override
public void onPictureSelect(String imagePath) {
// 这里对照片进行了按比例压缩,根据项目需要可能还会进行质量压缩
ivPhoto.setImageBitmap(ImageUtil.getSmallBitmap(imagePath, 358, 441));
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
selectPictureManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
selectPictureManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/**
* 退出时,删除临时图片
*/
@Override
protected void onDestroy() {
super.onDestroy();
FileUtils.DeleteFolder(FileUtils.TAKE_PIC_CACHE_PATH);
System.gc();
}
}
(完)