布局只有一个ImageViwe
<ImageView
android:id="@+id/image_avatar"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
添加点击事件,省略onCreate方法
//对话框显示的提示
private final String[] item_list = {"本地相册", "拍照"};
//选择本地图片时的图片类型
private final String IMAGE_TYPE = "image/*";
private final int FROM_GALLERY = 1000;
private final int FROM_CARAMA = 1001;
private final int RESIZE = 1002;
private Bitmap photo;
findViewById(R.id.image_avatar).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog();
}
});
//这里弹出对话框让用户选择
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setItems(item_list, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0:
getImageFromGalley();
break;
case 1:
getImageFromCamera();
break;
}
}
});
builder.create().show();
}
//从相册获取
private void getImageFromGalley() {
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType(IMAGE_TYPE);
startActivityForResult(galleryIntent, FROM_GALLERY);
}
//从相机获取
private void getImageFromCamera() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getCameraImageUri());
startActivityForResult(cameraIntent, FROM_CARAMA);
}
//设置拍完后照片的路径和名字
private Uri getCameraImageUri() {
String filePath = Environment.getExternalStorageDirectory().getPath();
filePath = filePath + "/" + "avatar.jpg";
return Uri.fromFile(new File(filePath));
}
下面来写获取完图片后的回调方法,这里使用了startActivityForResult方法,系统会自动回调onActivityResult方法,所以我们在该方法中进行相应操作
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//先判断resultCode是否为RESULT_OK才能进行余下操作,这里的FROM_GALLERY,FROM_CARAMA,RESIZE在上面已经定义过,根据自己喜欢自行定义
if (resultCode != getActivity().RESULT_OK) return;
switch (requestCode) {
case FROM_GALLERY:
//裁剪图片
resizeImage(data.getData(), FROM_GALLERY);
break;
case FROM_CARAMA:
//裁剪图片
resizeImage(getCameraImageUri(), FROM_CARAMA);
break;
case RESIZE:
if (data != null) showResizeImage(data);
break;
default:
toast("未知错误");
}
}
裁剪图片代码
private void resizeImage(Uri uri, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, IMAGE_TYPE);
intent.putExtra("crop", "image_true");
//aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
switch (requestCode) {
case FROM_GALLERY:
//使用Cursor遍历所有图片,这里的uploadFile是用来以后上传到服务器的,这里可以不用
String[] proj = {MediaStore.Images.Media.DATA};
Cursor mCursor = getActivity().getApplicationContext().getContentResolver().query(uri, proj, null, null, null);
int col_index = 0;
if (mCursor != null) {
col_index = mCursor.getColumnIndex(MediaStore.Images.Media.DATA);
}
mCursor.moveToFirst();
String filePath = mCursor.getString(col_index);
uploadFile = new File(filePath);
mCursor.close();
break;
case FROM_CARAMA:
String filePath_camera = uri.getPath();
uploadFile = new File(filePath_camera);
break;
}
startActivityForResult(intent, RESIZE);
}
裁剪完图片后又调用了startActivityForResult方法,这次在onActivityResult方法中就会调用我们设置图片的方法了。
private void showResizeImage(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
photo = extras.getParcelable("data");
imageAvatar.setImageBitmap(photo);
}
}