关于拍照截取和相册截取,看了网上很多资料,自己整理了一份比较详细的,供有需要的人参考
1 拍照
原理就是通过intent调用系统的相机,拍完照在回调进行操作,成功获取到拍完照的图片根据uri调用系统的裁剪页面,裁剪完也是在回调中进行处理,显示在页面的imageview中。
2 相册选取图片
原理也是通过intent打开系统的图片,用户选择完成以后在回调中根据图片的uri调用系统的裁剪页面,同上。
首先,定义几个常量
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2;
public static final int ACTION_CHOOSE=3;
private Uri imageUri;
//图片路径 private String filename;
//图片名称
然后在拍照和相册选择的按钮中处理事件
@Override public void onClick(View v) {
switch (v.getId()) {
case R.id.bt1: //拍照截取 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
filename = format.format(date);
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path, filename +".jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
}
catch (IOException e) {
e.printStackTrace();
}
//将File对象转换为Uri并启动照相程序 imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//照相 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//指定图片输出地址 startActivityForResult(intent, TAKE_PHOTO);
//启动照相 break;
case R.id.bt2: //相册选取 Intent intent2 = new Intent(Intent.ACTION_PICK);
intent2.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent2,ACTION_CHOOSE);
break;
}
}
最主要的在回调中的执行
// 使用startActivityForResult返回结果时调用的方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode!=RESULT_OK){
Toast.makeText(this, "取消了", Toast.LENGTH_SHORT).show();
return;
}
switch (requestCode) {
case TAKE_PHOTO: //拍照的回调 cropImage();
break;
case ACTION_CHOOSE: //选择照片的回调 imageUri = data.getData();
cropImage();
break;
case CROP_PHOTO: //裁剪完照片的回调 showPic();
break;
default: break;
}
}
裁剪图片的方法
/** * 裁剪图片 **/ private void cropImage() {
Intent intent = new Intent("com.android.camera.action.CROP");
//剪裁 intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
//设置宽高比例 intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//设置裁剪图片宽高 intent.putExtra("outputX", 340);
intent.putExtra("outputY", 340);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
Toast.makeText(MainActivity.this, "剪裁图片", Toast.LENGTH_SHORT).show();
//广播刷新相册 Intent intentBc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intentBc.setData(imageUri);
this.sendBroadcast(intentBc);
startActivityForResult(intent, CROP_PHOTO);
//设置裁剪参数显示图片至ImageView }
过程比较简单,可能会有一些判断的地方没有处理,如果有不对的地方希望有高手可以帮忙改进,谢谢~~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。