糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > Android7.0相机图册图片剪切封装 - ucrop框架

Android7.0相机图册图片剪切封装 - ucrop框架

时间:2023-06-08 15:29:51

相关推荐

Android7.0相机图册图片剪切封装 - ucrop框架

说明:

* 两天使用 ucrop框架 实现了从相册和图册选择图片,然后剪切返回显示的功能。同时兼容了相机拍照7.0。

* 对相机调用、相册调用、图片剪切封装成了工具类。

* 剪切图片框架ucrop我也写了一篇博客:Android 图片剪切框架 uCrop 简单集成

剪切示例图:

代码:

1、调用代码Activity:

ublic class AccountDataActivity extends Activity implements View.OnClickListener { //调用 @Override public void onClick(View v) { switch (v.getId()) { case R.id.ll_user_image: //相机或者相册选择 ImgUtil.choicePhoto(this); break; } } @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case ImgUtil.REQUEST_CODE_ALBUM://相册存储权限if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {ImgUtil.openAlbum(this);} else {UiUtil.showToast(this, "选择图库需要同意权限");}break;case ImgUtil.REQUEST_CODE_CAMERA://相机拍照权限if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//允许ImgUtil.openCamera(this);} else {//拒绝UiUtil.showToast(this, "只有同意相机权限,才能使用扫码功能");}break;default:}}//相机、相册、剪切 返回 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { //正确返回 if (resultCode == RESULT_OK) { switch (requestCode) { case ImgUtil.TAKE_PHOTO://相机返回 //相机返回图片,调用裁剪的方法 ImgUtil.startUCrop(AccountDataActivity.this, ImgUtil.imageUri, 1, 1); break; case ImgUtil.CHOOSE_PHOTO://相册返回 try { if (data != null) { Uri uri = data.getData(); //相册返回图片,调用裁剪的方法 ImgUtil.startUCrop(AccountDataActivity.this, uri, 1, 1); } } catch (Exception e) { e.printStackTrace(); UiUtil.showToast(this, "图片选择失败"); } break; case UCrop.REQUEST_CROP://剪切返回 Uri resultUri = UCrop.getOutput(data); //剪切返回,显示剪切的图片到布局 Glide.with(AccountDataActivity.this) .load(resultUri) .placeholder(R.drawable.bg_zhanweitu) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(iv_user_image); break; } } else { UiUtil.showToast(this, "图片选择失败"); } } }

2、工具类ImgUtil.java

package briefer.pet.utils;import android.Manifest;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import .Uri;import android.os.Build;import android.os.Environment;import android.provider.MediaStore;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v4.content.FileProvider;import com.yalantis.ucrop.UCrop;import com.yalantis.ucrop.UCropActivity;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import briefer.pet.R;import briefer.pet.ui.activity.AccountDataActivity;import briefer.pet.ui.activity.AddZhuRenActivity;import static com.avos.avoscloud.AVPersistenceUtils.getCacheDir;/*** 图片工具类* 打开相机、打开相册、剪切图片* Created by zst on /11/29.*/public class ImgUtil {public static final int TAKE_PHOTO = 1;//拍照public static final int CHOOSE_PHOTO = 2;//选择相册public static final int REQUEST_CODE_CAMERA = 3;//相机权限请求public static final int REQUEST_CODE_ALBUM = 4;//相册权限请求public static Uri imageUri;//相机拍照图片保存地址/*** 选择图片,从图库、相机** @param activity 上下文*/public static void choicePhoto(final Activity activity) {//采用的是系统Dialog作为选择弹框new AlertDialog.Builder(activity).setTitle("上传头像")//设置对话框标题.setPositiveButton("拍照", new DialogInterface.OnClickListener() {//添加确定按钮@Overridepublic void onClick(DialogInterface dialog, int which) {if (Build.VERSION.SDK_INT >= 23) {//检查相机权限ArrayList<String> permissions = new ArrayList<>();if (activity.checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {permissions.add(Manifest.permission.CAMERA);}if (permissions.size() == 0) {//有权限,跳转//打开相机-兼容7.0openCamera(activity);} else {activity.requestPermissions(permissions.toArray(new String[permissions.size()]), REQUEST_CODE_CAMERA);}} else {//打开相机-兼容7.0openCamera(activity);}}}).setNegativeButton("系统相册", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//如果有权限申请,请在Activity中onRequestPermissionsResult权限返回里面重新调用openAlbum()if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_ALBUM);} else {openAlbum(activity);}}}).show();//在按键响应事件中显示此对话框}/*** 打开相机* 兼容7.0** @param activity*/public static void openCamera(Activity activity) {// 创建File对象,用于存储拍照后的图片File outputImage = new File(activity.getExternalCacheDir(), "output_image.jpg");try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}if (Build.VERSION.SDK_INT < 24) {imageUri = Uri.fromFile(outputImage);} else {//Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri//参数二:fileprovider绝对路径 com.dyb.testcamerademo:项目包名imageUri = FileProvider.getUriForFile(activity, "briefer.pet.fileprovider", outputImage);}// 启动相机程序Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);activity.startActivityForResult(intent, TAKE_PHOTO);}public static void openAlbum(Activity activity) {//调用系统图库的意图Intent choosePicIntent = new Intent(Intent.ACTION_PICK, null);choosePicIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");activity.startActivityForResult(choosePicIntent, CHOOSE_PHOTO);//打开系统默认的软件//Intent intent = new Intent("android.intent.action.GET_CONTENT");//intent.setType("image/*");//activity.startActivityForResult(intent, CHOOSE_PHOTO); // 打开相册}/*** 启动裁剪** @param activity上下文* @param sourceUir 需要裁剪图片的Uri* @param aspectRatioX 裁剪图片宽高比* @param aspectRatioY 裁剪图片宽高比* @return*/public static void startUCrop(Activity activity, Uri sourceUir, float aspectRatioX, float aspectRatioY) {//裁剪后保存到文件中Uri destinationUri = Uri.fromFile(new File(getCacheDir(), System.currentTimeMillis() + ".jpg"));//初始化,第一个参数:需要裁剪的图片;第二个参数:裁剪后图片UCrop uCrop = UCrop.of(sourceUir, destinationUri);//初始化UCrop配置UCrop.Options options = new UCrop.Options();//设置裁剪图片可操作的手势options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);//设置toolbar颜色options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));//设置状态栏颜色options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));//是否隐藏底部容器,默认显示options.setHideBottomControls(true);//是否能调整裁剪框options.setFreeStyleCropEnabled(true);uCrop.withOptions(options);//设置裁剪图片的宽高比,比如16:9(设置后就不能选择其他比例了、选择面板就不会出现了)uCrop.withAspectRatio(aspectRatioX, aspectRatioY);uCrop.start(activity);}/*** 得到byte[]* 这里对传入的图片Uri压缩到1M以内,并转换为byte[]后返回** @param activity 上下文* @param uri传入图片的Uri* @return byte[]*/public static byte[] getImgByteFromUri(Activity activity, Uri uri) throws IOException {Bitmap bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);ByteArrayOutputStream out = new ByteArrayOutputStream();press(pressFormat.PNG, 100, out);//100表示不压缩,直接放到out里面int options = 90;//压缩比例while (out.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩out.reset(); // 重置baos即清空press(pressFormat.JPEG, options, out);// 这里压缩options%,把压缩后的数据存放到baos中options -= 10;// 每次都减少10}byte[] bs = out.toByteArray();return bs;}}

相机选择:采用固定地址选择大图方式,上段代码块是适配7.0的,因为Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri。其中android:name、exported、 android:grantUriPermissions、取值固定,android:authorities取值为:“自己项目包名”.fileprovider。

3.AndroidManifest.xml

<!--获取sd卡写的权限,用于文件上传和下载--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><!--允许读取手机状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!-- 相机权限 --><uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.VIBRATE"/><uses-permission android:name="android.permission.FLASHLIGHT"/><application<!--7.0相机权限--><providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.dyb.testcamerademo.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider></application>

4、file_paths.xml

android:resource=“@xml/file_paths”中@xml/的文件名字可以随便起,但一般规范化都用此名。

xml包下(在res下面新建包xml,然后在xml下面新建file_paths.xml文件)

* file_paths.xml源码

<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="/apk/res/android"><!--name属性的值可以随便写,别名path属性的值表示共享的具体位置,设置空就表示将整个SD卡进行共享--><paths><external-pathname="camera_photos"path=""/></paths></paths>

结束:

由于代码是项目代码,只能把所有功能代码拷贝出来,这里是全部代码了。实际开发中需要不断调试、耐心调试。

如果觉得《Android7.0相机图册图片剪切封装 - ucrop框架》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。