Android+截图+不改变源文件

来源:互联网 发布:php 随机红包算法 编辑:程序博客网 时间:2024/05/21 07:55

公司需要一个上传照片功能,可以选取手机相册图片,也可以选择照相,照相就不说了,比较简单,选取手机相册图片里面坑比较多

选择图片之后,调用系统的裁剪功能,裁剪之后,源文件也被改变,这个体验不太好,但是怎么办呢,我想的策略是裁剪之前,将原图片复制到另外一个文件夹,然后使用这个新建的文件夹中的图片,对其进行裁剪


第一步:

/* 请求识别码 */
private static final int CODE_GALLERY_REQUEST = 0xa0;

/**
* 从本地相册选取图片
*/
private void choseImageFromGallery() {
Intent intentFromGallery = new Intent();
// 设置文件类型
intentFromGallery.setType("image/*");
intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
}

第二步:

第一步是打开手机相册,进行操作之后会进入到回调

没做操作,就会返回,选取图片之后进入 CODE_GALLERY_REQUEST代码块

1.选取图片之后,我们可以通过intent.getData()得到图片的路径,但是intent.getData()只能得到一个对象;

2.所以,调用getRealPathFromURI(intent.getData())解析得到图片的uri路径;

3.拿到我们选取的图片路径之后就好办了,调用copyFile(getRealPathFromURI(intent.getData())),将原图片复制到另外一个文件夹,这个文件夹可以随意,自 己方便查找就行

4.就是调用我们的裁剪图片方法了

@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
// 用户没有进行有效的设置操作,返回
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show();
return;
}

switch (requestCode) {
case CODE_GALLERY_REQUEST:
String path = copyFile(getRealPathFromURI(intent.getData()));
if (path != null) {
Log.i("photo", "path:" + path);
Log.i("photo", "uri:" + Uri.fromFile(new File(path)));
cropImageUri(Uri.fromFile(new File(path)), 240, 240,
CROP_SMALL_PICTURE);
return;
}
Toast.makeText(context, "路径为空", 100).show();
break;

case CROP_SMALL_PICTURE:
if (imageUri != null) {
Bitmap bitmap = decodeUriAsBitmap(imageUri);
photo.setImageBitmap(bitmap);
} else {
Log.e("photo", "CROP_SMALL_PICTURE: data = " + intent);
}
break;
}
super.onActivityResult(requestCode, resultCode, intent);
}



/**
* 解析Intent.getdata()得到的uri为String型的filePath

* @param contentUri
* @return
*/
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

/**
* 复制文件至另外一个文件夹

* @param path
*            文件路径
*/
private String copyFile(String path) {
boolean flag = false;
String targetFolder = Environment.getExternalStorageDirectory()
+ "/Android/" + Environment.getDataDirectory()
+ "/com.cqchina.android/files/Cqaa/crop";// 目标文件夹
// 如果原文件不存在
if (fileExists(path) == false) {
return null;
}
if (fileExists(targetFolder) == false) {
new File(targetFolder).mkdirs(); // 如果文件夹不存在 则建立新文件夹
}
File file = new File(path);
try {
FileInputStream in = new FileInputStream(file); // 解析文件,转化为字节流
FileOutputStream out = new FileOutputStream(new File(targetFolder
+ File.separator + file.getName())); // 创建写入流,加载写入地址file
int len = 0;
byte[] buf = new byte[1024]; // 每次读取1KB,限定每次读取大小,使得不会读取太多出现崩溃
while ((len = in.read(buf)) != -1) { // 如果每次读取的不为空
out.write(buf, 0, len); // 每次按字节写入目标文件
}
flag = true;
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (flag) {
return targetFolder + File.separator + file.getName();
}
return null;
}


/**
* 判断文件是否存在

* @param filePath
* @return
*/
private boolean fileExists(String filePath) {
File file = new File(filePath);
return file.exists();
}


/**
* 检查设备是否存在SDCard的工具方法
*/
public static boolean hasSdcard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
// 有存储的SDCard
return true;
} else {
return false;
}
}

private Uri imageUri;


/**
* 拍照剪切图片

* @param uri
*            图片地址
* @param outputX
*            输出宽
* @param outputY
*            输出高
* @param requestCode
*            请求码
*/
private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
this.imageUri = uri;
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}


private Bitmap decodeUriAsBitmap(Uri uri) {
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}

0 0