1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 安卓选择相册或者相机图片并裁剪适配华为小米机型

安卓选择相册或者相机图片并裁剪适配华为小米机型

时间:2021-07-01 04:09:25

相关推荐

安卓选择相册或者相机图片并裁剪适配华为小米机型

选择图片上传基本是标配了,有必要写好个通用的方法以便使用,以下是一堆代码,使用的时候粘贴进去就可以了。

基本解决了一些常出现的问题:华为手机适配,6.0权限申请,图片大小控制。

1、关于权限问题,我们使用一个开源库:

dependencies {compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.mylhyl:acp:1.1.7'}

相机与相册都需要读写权限,相机还需要照相权限。

2、具体代码,拷贝就能用:

// 拍照成功,读取相册成功,裁减成功private final int ALBUM_OK = 101, CAMERA_OK = 102, CUT_OK = 103;private File bitfile;

private void xiangji() {Acp.getInstance(mContext).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).build(), new AcpListener() {@Override public void onGranted() {File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) {dou.mkdirs();// 2.创建相片的存储目录 }// 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除 String fileName = new SimpleDateFormat("ss-SSS").format(new Date()) + ".jpg"; bitfile = new File(dou, fileName); // 来自相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile)); startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识 }@Override public void onDenied(List<String> list) {Qiuutil.ShortToast(list.toString() + "权限拒绝"); }});}private void xiangce() {Acp.getInstance(PersonInfoActivity.this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {@Override public void onGranted() {File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) {dou.mkdirs();// 2.创建相片的存储目录 }// 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除 String fileName = new SimpleDateFormat("ss-SSS").format(new Date()) + ".jpg"; bitfile = new File(dou, fileName); // 来自相册 Intent albumIntent = new Intent(Intent.ACTION_PICK, null); /** * 下面这句话,与其它方式写是一样的效果,如果: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");设置数据类型 * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" */albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(albumIntent, ALBUM_OK); }@Override public void onDenied(List<String> list) {Qiuutil.ShortToast(list.toString() + "权限拒绝"); }});}

/*** 裁剪图片方法实现**@paramuri 图片uri*@paramtype类别:相机,相册*/public void clipPhoto(Uri uri, int type) {Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1) intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", false); /** * 此处做一个判断 * 1,相机取到的照片,我们把它做放到了定义的目录下。就是file * 2,相册取到的照片,这里注意了,因为相册照片本身有一个位置,我们进行了裁剪后,要给一个裁剪后的位置, * 不然onActivityResult方法中,data一直是null */ if (type == CAMERA_OK) {intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } else {intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile)); }startActivityForResult(intent, CUT_OK);}

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {System.out.println("requestCode = " + requestCode); switch (requestCode) {// 如果是直接从相册获取 case ALBUM_OK://从相册中获取到图片了,才执行裁剪动作 if (data != null) {clipPhoto(data.getData(), ALBUM_OK);//setPicToView(data); }break; // 如果是调用相机拍照时 case CAMERA_OK:// 当拍照到照片时进行裁减,否则不执行操作 if (bitfile.exists()) {clipPhoto(Uri.fromFile(bitfile), CAMERA_OK);//开始裁减图片 }break; // 取得裁剪后的图片,这里将其设置到imageview中 case CUT_OK:/** * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意, * 要重新裁剪,丢弃 当前功能时,会报NullException */if (data != null) {try {// Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()));// i1.setImageBitmap(bitmap);Bitmap bm = BitmapFactory.decodeFile(bitfile.getAbsolutePath());

//这里获取了Bitmap,就可以进行显示操作,而一般上传去网上,可以使用文件路径bitfile.getAbsolutePath(),// 这不推荐用data进行数据操作,特别因为华为手机方法与其他手机不一致,容易bug。

mRoundImageView2.setImageBitmap(bm);Qiuutil.LogE(Uri.fromFile(bitfile) + ":" + bitfile.getAbsolutePath());} catch (Exception ex) {ex.printStackTrace();} } else {Log.e("图片数据获取Main", "data为空"); } break; default: break; } super.onActivityResult(requestCode, resultCode, data);}

调用时:

mTextView2.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {//xiangji(); xiangce(); }});

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