- 从手机相册中获取图片截取上传
1.调用手机相册activity
intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, REQUEST_CODE_900);
2.onActivityResult中获取URI数据
// 获取原图路径
String orgImagePath = getRealPathFromURI(data.getData());
// 拷贝原图到指定SD卡目录 headFilePath为SD上保存图片的路径
if (copyFile(new File(orgImagePath), new File(
headFilePath))) {
//新建一个headFilePath对应的Uri
Uri headFileUri = Uri.fromFile(new File(headFilePath));
//裁剪图片
startImgResize(headFileUri);
}
public String getRealPathFromURI(Uri contentUri) {
// 待查询的字段
String[] proj = { MediaStore.Images.Media.DATA };
// 调用activity提供的managedQuery查询uri中的数据
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
if (cursor != null) {
// 获取游标中指定字段的索引
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else {
// 如果游标为空说明获取的已经是绝对路径了
return contentUri.getPath();
}
}
/**
* 复制图片
*/
public static boolean copyFile(File srcFile, File saveFile) {
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream(srcFile));
bos = new BufferedOutputStream(new FileOutputStream(saveFile));
byte[] buffer = new byte[1024];
int len = -1;
while (-1 != (len = bis.read(buffer))) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
}
}
}
return true;
}
/**
* @param uri
* 所需要裁剪的图片的uri
*/
public void startImgResize(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP"); // 裁剪意图
intent.setDataAndType(uri, "image/*"); // 格式
intent.putExtra("crop", "true"); // 发送裁剪信号
intent.putExtra("aspectX", 1); // X方向上的比例
intent.putExtra("aspectY", 1); // Y方向上的比例
intent.putExtra("outputX", 300); // 裁剪区的宽
intent.putExtra("outputY", 300); // 裁剪区的高
intent.putExtra("scale", true); // 是否保留比例
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 将URI指向相应的file:///
intent.putExtra("return-data", false); // 是否将数据保留在Bitmap中返回
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", false); // 不检测人脸
intent.putExtra("circleCrop", false); // 圆形裁剪区域
intent.putExtra("scaleUpIfNeeded", true);// 去黑边
startActivityForResult(intent, REQUEST_CODE_800);//在onActivityResult中调用上传逻辑
}
- 用相机拍照后截取上传
1.调用相机拍照activity
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定一个Uri作为照片输出的路径
Uri headFileUri = Uri.fromFile(new File(headFilePath));
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
headFileUri);
startActivityForResult(intent, REQUEST_CODE_700);
2.onActivityResult中
startImgResize(headFileUri);//裁剪图片
3.上传图片
处理逻辑同从相册中获取照片上传。
intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, REQUEST_CODE_900);
2.onActivityResult中获取URI数据
// 获取原图路径
String orgImagePath = getRealPathFromURI(data.getData());
// 拷贝原图到指定SD卡目录 headFilePath为SD上保存图片的路径
if (copyFile(new File(orgImagePath), new File(
headFilePath))) {
//新建一个headFilePath对应的Uri
Uri headFileUri = Uri.fromFile(new File(headFilePath));
//裁剪图片
startImgResize(headFileUri);
}
public String getRealPathFromURI(Uri contentUri) {
// 待查询的字段
String[] proj = { MediaStore.Images.Media.DATA };
// 调用activity提供的managedQuery查询uri中的数据
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
if (cursor != null) {
// 获取游标中指定字段的索引
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else {
// 如果游标为空说明获取的已经是绝对路径了
return contentUri.getPath();
}
}
/**
* 复制图片
*/
public static boolean copyFile(File srcFile, File saveFile) {
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream(srcFile));
bos = new BufferedOutputStream(new FileOutputStream(saveFile));
byte[] buffer = new byte[1024];
int len = -1;
while (-1 != (len = bis.read(buffer))) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
}
}
}
return true;
}
/**
* @param uri
* 所需要裁剪的图片的uri
*/
public void startImgResize(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP"); // 裁剪意图
intent.setDataAndType(uri, "image/*"); // 格式
intent.putExtra("crop", "true"); // 发送裁剪信号
intent.putExtra("aspectX", 1); // X方向上的比例
intent.putExtra("aspectY", 1); // Y方向上的比例
intent.putExtra("outputX", 300); // 裁剪区的宽
intent.putExtra("outputY", 300); // 裁剪区的高
intent.putExtra("scale", true); // 是否保留比例
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // 将URI指向相应的file:///
intent.putExtra("return-data", false); // 是否将数据保留在Bitmap中返回
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", false); // 不检测人脸
intent.putExtra("circleCrop", false); // 圆形裁剪区域
intent.putExtra("scaleUpIfNeeded", true);// 去黑边
startActivityForResult(intent, REQUEST_CODE_800);//在onActivityResult中调用上传逻辑
}
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定一个Uri作为照片输出的路径
Uri headFileUri = Uri.fromFile(new File(headFilePath));
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
headFileUri);
startActivityForResult(intent, REQUEST_CODE_700);
startImgResize(headFileUri);//裁剪图片