從相冊選相片饵溅,或者拍照選相片再裁剪是眾多app都有的功能。做法很簡單妇萄,這里我寫了一個(gè)demo實(shí)現(xiàn)頭像選擇蜕企。
啥也不說了,先上效果圖:
相冊選擇
拍照獲取
實(shí)現(xiàn)步驟:
1.彈框選擇框所用的popupwindow
private void showPopupwindow(){
DoubleSelectPopupWindow popupWindow = new DoubleSelectPopupWindow(this);
popupWindow.showAtLocation(rootView, Gravity.BOTTOM,0,0);
popupWindow.init("頭像選擇",strs);
popupWindow.setOnSelectListener(new DoubleSelectPopupWindow.ICallIntListener() {
@Override
public void callBack(int pos) {
if(pos == 0){
choosePicUtil.takePic(ChoosePicUtil.CODE_CAMERA_REQUEST);
}else{
choosePicUtil.choosePic();
}
}
});
}
2.takepic()和choosePic()方法嚣伐;分別使用MediaStore.ACTION_IMAGE_CAPTURE糖赔、MediaStore.ACTION_GET_CONTENT兩個(gè)意圖調(diào)起系統(tǒng)拍照和圖片選擇。
getRealFilePath(final Uri uri )可將裁剪圖片的uri轉(zhuǎn)為sd卡路徑轩端。
/**
* 選擇圖片或拍照工具
*/
public class ChoosePicUtil {
private Context context;
private Uri imageUri;
private Uri imageCropUri;
public static final int CODE_CAMERA_REQUEST = 0;
public static final int CODE_CHOOSE_REQUEST = 1;
public static final int CODE_CAMERA_CROP_REQUEST = 2;
public ChoosePicUtil(Context context, Uri imageUri, Uri imageCropUri){
this.context = context;
this.imageUri = imageUri;
this.imageCropUri = imageCropUri;
}
/**
* 拍照
* @param resultCode
*/
public void takePic(int resultCode){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
((Activity)context).startActivityForResult(intent, resultCode);
}
/**
* 裁剪圖片
* @param uri
*/
public void cropImg(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP"); //調(diào)用裁剪
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1); //設(shè)置寬高比例為1:1
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 700); //設(shè)置裁剪圖片寬高700x700
intent.putExtra("outputY", 700);
intent.putExtra("return-data", false);
intent.putExtra("scale",true);
intent.putExtra("scaleUpIfNeeded", true); //防止出現(xiàn)黑邊框
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); //設(shè)置輸出格式
intent.putExtra("noFaceDetection", true);
((Activity)context).startActivityForResult(intent, CODE_CAMERA_CROP_REQUEST);
}
public void choosePic(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
((Activity)context).startActivityForResult(intent, CODE_CHOOSE_REQUEST);
}
public String getRealFilePath(final Uri uri ) {
if ( null == uri ) return null;
final String scheme = uri.getScheme();
String data = null;
if ( scheme == null )
data = uri.getPath();
else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
data = uri.getPath();
} else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
if ( null != cursor ) {
if ( cursor.moveToFirst() ) {
int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
if ( index > -1 ) {
data = cursor.getString( index );
}
}
cursor.close();
}
}
return data;
}
}
3.設(shè)置選擇圖片和裁剪圖片的路徑放典,設(shè)置給第二步的ChoosePicUtil類。
File file = new File(picSavePath + "/avator.jpg");
imageUri = Uri.fromFile(file);
File cropFile = new File(picSavePath + "/avator_crop.jpg");
imageCropUri = Uri.fromFile(cropFile);
choosePicUtil = new ChoosePicUtil(this,imageUri,imageCropUri);
4.在onActivityResult方法中獲取startActivityforResult()裁剪圖片路徑的回調(diào)》芄梗回調(diào)接收的流程是:拍照或選擇圖片分別走case1壳影,case3;都會(huì)調(diào)用cropImg()去裁剪圖片弥臼,裁剪完回調(diào)再走case2情況宴咧,從data中獲取裁剪后的uri。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
switch (requestCode){
case ChoosePicUtil.CODE_CAMERA_REQUEST:
choosePicUtil.cropImg(imageUri);
break;
case ChoosePicUtil.CODE_CAMERA_CROP_REQUEST:
Bundle extras = data.getExtras();
if (extras != null) {
//獲取bitmap
Bitmap bitmap = BitmapFactory.decodeFile(choosePicUtil.getRealFilePath(imageCropUri));
ivAvator.setImageBitmap(bitmap);
}
break;
case ChoosePicUtil.CODE_CHOOSE_REQUEST:
choosePicUtil.cropImg(data.getData());
break;
}
}
}
不過注意:Android7.0以上系統(tǒng)嘗試傳遞 file:// URI 會(huì)觸發(fā) FileUriExposedException径缅,就需要使用FileProvider來獲取掺栅。