调用系统拍照或相册功能获取裁剪以后的图片
2016-10-20 14:13
323 查看
在一些项目中,可能需要实现点击弹出dialog。点击“相册”按钮跳转到系统相册功能,选择一个图片裁剪以后得到裁剪的图片。点击“拍照”按钮调用系统的拍照功能,拍照结束以后得到照片进行裁剪,最后返回一个裁剪完成的图片。
大致的效果图如下:
“相册”:跳转到系统相册功能,选择一个图片裁剪以后得到裁剪的图片。
“拍照”:跳转到系统的拍照功能,拍照结束以后得到照片进行裁剪,最后返回一个裁剪完成的图片。
大致意思已经表达完毕,现在开始实现:
首先我们需要一个监听事件点击弹出一个dialog的提示框
selectImage()方法是我自定义的一个方法,现在来看看里面的代码,它的功能就是弹出一个dialog。
现在来看看,getCamera();这个方法的内容:
现在来看看,本activity接收返回值的方法:
现在来看,裁剪功能:
存储到本地的方法,saveBmp(bitmap);
我定义的全局变量,方便大家理解。
这就完事了。欢迎各位大神批评指教。
大致的效果图如下:
“相册”:跳转到系统相册功能,选择一个图片裁剪以后得到裁剪的图片。
“拍照”:跳转到系统的拍照功能,拍照结束以后得到照片进行裁剪,最后返回一个裁剪完成的图片。
大致意思已经表达完毕,现在开始实现:
首先我们需要一个监听事件点击弹出一个dialog的提示框
@Override public void onClick(View view) { switch (view.getId()) { case R.id.rl_information_change: //点击一个按钮,弹出dialog实现图片选择方式 selectImage(); break; } }
selectImage()方法是我自定义的一个方法,现在来看看里面的代码,它的功能就是弹出一个dialog。
/** * 弹出dialog选择是相册还是拍照 */ private void selectImage() { new MaterialDialog.Builder(this) .title("上传图片") .items(new String[]{"相册", "拍照"}) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) { switch (position) { //相册 case 0: Intent intentFromGallery = new Intent(); intentFromGallery.setType("image/*"); // 设置文件类型 //返回一个 4000 IMAGE_REQUEST_CODE标志,IMAGE_REQUEST_CODE=0,点击“相册”该dialog就会消失,同时给本activity返回一个IMAGE_REQUEST_CODE的值。 intentFromGallery.setAction(Intent.ACTION_PICK); startActivityForResult(intentFromGallery, IMAGE_REQUEST_CODE); dialog.dismiss(); break; //拍照 case 1: //这是自定义的方法,里面用来调用系统的拍照功能。 getCamera(); dialog.dismiss(); break; } } }).show(); }
现在来看看,getCamera();这个方法的内容:
@AfterPermissionGranted(MY_CAMMER) private void getCamera() { if (EasyPermissions.hasPermissions(myApplication, Manifest.permission.CAMERA)) { //调用系统拍照功能 Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //拍照得到的图片放在“Constant.CACHE_DIR + "temp.jpg"”的文件里。 intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Constant.CACHE_DIR + "temp.jpg"))); //返回本activity。 startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE); } else { EasyPermissions.requestPermissions(this, "需要相机权限", MY_CAMMER, Manifest.permission.CAMERA); } }
现在来看看,本activity接收返回值的方法:
/** * 返回的结果 * * @param requestCode * @param resultCode * @param data */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { //获取系统的现有图片 case IMAGE_REQUEST_CODE: if (resultCode == this.RESULT_CANCELED) { } else { //自定义的裁剪图片的方法 startPhotoZoom(data.getData()); } break; //拍照得到的图片 case CAMERA_REQUEST_CODE: if (resultCode == this.RESULT_CANCELED) { } else { File parent = new File(Constant.CACHE_DIR); if (!parent.exists()) { parent.mkdirs(); } File tempFile = new File(Constant.CACHE_DIR + "temp.jpg"); startPhotoZoom(Uri.fromFile(tempFile)); } break; //裁剪完成返回的结果 case RESULT_REQUEST_CODE: if (resultCode == this.RESULT_CANCELED) { } else { if (data != null) { // getImageToView(data); //将Uri图片转换为Bitmap try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile)); //把图片存储在本地 mFileName = saveBmp(bitmap); imageStr = mFileName; userFlag = true; Glide.with(this).load(mFileName).transform(new GlideCircleTransform(this)).into(mIvInformationImage); // mIvInformationImage.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } break; } }
现在来看,裁剪功能:
/** * 调用系统裁剪功能 * * @param uri 要裁剪的地址。 */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 设置裁剪 // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 5); intent.putExtra("aspectY", 5); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 550); intent.putExtra("outputY", 375); //uritempFile为Uri类变量,实例化uritempFile uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); intent.putExtra("outputFormat", Bitmap.CompressFormat.WEBP.toString()); startActivityForResult(intent, RESULT_REQUEST_CODE); }
存储到本地的方法,saveBmp(bitmap);
//存图片到本地 private String saveBmp(Bitmap bmp) { String fileName = Constant.CACHE_DIR + System.currentTimeMillis() + ".jpg"; FileOutputStream stream = null; try { File parent = new File(Constant.CACHE_DIR); if (!parent.exists()) { parent.mkdirs(); } stream = new FileOutputStream(fileName); bmp.compress(Bitmap.CompressFormat.JPEG, 90, stream); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { stream.flush(); stream.close(); } catch (IOException e) { e.printStackTrace(); } } // bmp.recycle(); return fileName; }
我定义的全局变量,方便大家理解。
private static final int MY_CAMMER = 122; private static final int IMAGE_REQUEST_CODE = 0; private static final int CAMERA_REQUEST_CODE = 1; private static final int RESULT_REQUEST_CODE = 2; private Uri uritempFile; private String mFileName;
这就完事了。欢迎各位大神批评指教。
相关文章推荐
- android 调用系统相册选取照片或者打开相机拍照获取图片
- android 4.4以上调用系统拍照与相册附带图片裁剪
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
- Android7.0调用系统相机拍照、相册选择图片、裁剪
- Andorid调用系统的拍照功能和系统图库对图片进行裁剪
- 个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
- Android拍照和相册+系统裁剪功能返回图片
- android中调用系统功能 来显示本地相册图片 拍照 视频 音频功能
- Android调用系统相机、相册功能,适配6.0权限获取以及7.0以后获取URI(兼容多版本)
- Android拍照及图片裁剪、调用系统相册(兼容6.0以上权限处理及7.0以上文件管理)
- Android手机调用系统相机拍照、裁剪以及获取Url上传图片
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- Android中调用系统相机、系统相册来获取图片,并裁剪图片。
- android 调用系统相册选取照片或者打开相机拍照获取图片
- Android7.0调用系统相机拍照、相册选择图片、裁剪 图片压缩
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时为什么会回到home界面或者到前一个界面,然后才会跳转到当前activity
- 调用系统相机拍照获取图片或者从相册中调用本地图片显示问题
- Android 调用相册 拍照 实现系统控件缩放 切割图片
- 调用系统相机拍照,裁剪图片