在写应用中,经常用到头像,所以自己专门写了一个Activity来处理,直接返回所需要的数据,这里我返回的是Uri,再做处理,原理一样,大家可以根据自己应用的需求改相应的代码。
跳转到系统相机,注意设置拍照后照片的输出路径:
/**
* 选择相机
*/
// 请求加载系统照相机
private static final int REQUEST_CAMERA = 100;
// 设置系统相机拍照后的输出路径
private File mTmpFile;
private void showCameraAction() { // 跳转到系统照相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(cameraIntent.resolveActivity(getPackageManager()) != null) { // 设置系统相机拍照后的输出路径 mTmpFile = createTmpFile(this); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile)); startActivityForResult(cameraIntent, REQUEST_CAMERA); } else{ Toast.makeText(this, "没有系统相机", Toast.LENGTH_SHORT).show(); }}
跳转到相册:
/**
* 选择照片
*/
// 请求加载系统图片
private static final int REQUEST_PHOTO = 101;
private void showPhotoAction() { Intent photoIntent = new Intent(Intent.ACTION_GET_CONTENT); photoIntent.setType("image/*"); startActivityForResult(photoIntent, REQUEST_PHOTO);}
拍照、相册完成后,在onResultActivity中获得数据:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CAMERA: // 相机拍照完成后,返回图片路径
if(resultCode == Activity.RESULT_OK) {
if (mTmpFile != null) {
cropImage(Uri.fromFile(mTmpFile), data);
}
} else{
if(mTmpFile != null && mTmpFile.exists()){
mTmpFile.delete();
finish();
}
}
break;
case REQUEST_PHOTO: // 选择照片
if (data == null) {
finish();
}
cropImage(data.getData(), data);
break;
case REQUEST_CROP_IMAGE: // 剪裁图片->同样返回Uri,不返回data
if (data == null) {
finish();
}
Intent intent2 = new Intent();
intent2.putExtra(EXTRA_RESULT, mUri);
setResult(RESULT_OK, intent2);
finish();
break;
default:
break;
}
}
若需要裁剪,可以增加裁剪的代码,这里我添加了:
/**
* 裁剪图片
* @param uri
*/
private void cropImage(Uri uri, Intent data) {
mUri = uri;
if (isShowCrop == 1) { // 裁剪
Intent intent1 = new Intent("com.android.camera.action.CROP");
//intent1.setType("image/*");
intent1.setDataAndType(uri, "image/jpeg");// data是图库选取文件传回的参数
intent1.putExtra("crop", "true");
intent1.putExtra("aspectX", 1);
intent1.putExtra("aspectY", 1);
intent1.putExtra("outputX", 120);
intent1.putExtra("outputY", 120);
intent1.putExtra("scale", true);
intent1.putExtra("noFaceDetection", true);
intent1.putExtra("return-data", false);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent1, REQUEST_CROP_IMAGE);
} else if (isShowCrop == 0){ // 不剪裁
Intent intent2 = new Intent();
intent2.putExtra(EXTRA_RESULT, uri);
setResult(RESULT_OK, intent2);
finish();
}
}
后续还要增加传入存放照片的地址,图片压缩等,总之,根据自己的应用需求来吧,使之更好的为应用服务。