一、背景
最近项目中用到了手机拍照,图片的选取的功能,这类功能差不多已经被用烂了,而且网上也有许多很好的第三方库,但是有的时候,项目对于这类功能并没有什么大的要求,只需要简单实现其功能即可。调用系统提供的方法肯定是最简单啦,虽然做出来的效果不如各种自定义的好看,但是功能上是一样一样滴,最关键的是,自己需要什么就实现什么就得了,代码很少。
二、概述
调用系统相机、使用手机自带的图片选择器、系统的裁剪功能
实现起来的思路其实也很简单,我们只需要使用 Intent 隐式启动系统的活动 activity,根据需要配置一下参数。
我们调用系统相机的时候,可以手动设置拍照完成后图片的输出路径,为什么需要手动设置,难道这个在系统拍照 activity finish 掉时不给我们回传吗,理论上数据都携带在了:
onActivityResult(int requestCode, int resultCode, Intent data)
这个方法的 data 之中,但是很操蛋的是,intent携带的数据量并不是无限的(最大携带数据量为 1M),随着现在手机拍照出来的图片越来越高清,intent的小三轮已经拉不动 800 斤的壮汉啦,所以系统在 data 里面就会给你返回一个 null,这个时候我们配置的图片路径就显出作用了,哈?有啥作用?有了图片路径那还不是你想咋地就咋地了。
代码实现起来很简单,但是需要注意权限的添加,而且自 android6.0 起,app不会在安装时授予权限,而是在运行时一个一个向用户询问是否授予权限。
1.代码直接贴出来了,比较简单,不太了解直接下载 demo 看看吧
/**
* 去调用系统相机
*/
private void toOpenSystemCamera() {
//调用拍照活动
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//设置图片的输出地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, toCreateImageUri());
startActivityForResult(intent, CAMERA_SUCCESS_CODE);
}
/**
* 去创建一个拍照后文件输出的位置
*/
private Uri toCreateImageUri() {
File file = new File(Environment.getExternalStorageDirectory()
, System.currentTimeMillis()+"cameratest.jpg");
try {
if (file.exists()) {
file.delete();
}
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
uri = Uri.fromFile(file);
return uri;
}
/**
* 打开系统相册
*/
private void toOpenSystemPicture() {
//打开系统资源库
Intent intentSel =
new Intent(Intent.ACTION_PICK
, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intentSel, PICTURE_SUCCESS_CODE);
}
/**
* 打开系统的剪切界面
*/
private void toCropPicture(Uri iamgeUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(iamgeUri, "image/*");
//是否可以缩放
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, iamgeUri);
startActivityForResult(intent, CROP_SUCCESS_CODE);
}