在整理以前的代码,发现修改头像这块儿代码臃肿,改起来麻烦,看着难受,所以将这块儿重新写了一下(真不知道当时是怎么把这些代码堆到一起的,,o(╥﹏╥)o)!!!
把跳转到系统相机,相册和图片剪裁统一放到了一个工具类里面,然后再activity内进行相关操作,通过接口回调的方式进行UI的更新跳转,剪裁图片,思路有了接下来上代码!!!
弹出一个popup来进行选择去相机还是相册
private void modifyTouXiang() {
View view = LayoutInflater.from(this).inflate(R.layout.layout_popupwindow, null);
TextView btnCarema = (TextView) view.findViewById(R.id.btn_camera);
TextView btnPhoto = (TextView) view.findViewById(R.id.btn_photo);
TextView btnCancel = (TextView) view.findViewById(R.id.btn_cancel);
final PopupWindow popupWindow = new PopupWindow(view,
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(getResources().getDrawable(android.R.color.transparent));
popupWindow.setOutsideTouchable(true);
View parent = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
popupWindow.showAtLocation(parent, Gravity.BOTTOM, 0, 0);
//popupWindow在弹窗的时候背景半透明
final WindowManager.LayoutParams params = getWindow().getAttributes();
params.alpha = 0.5f;
getWindow().setAttributes(params);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
params.alpha = 1.0f;
getWindow().setAttributes(params);
}
});
//取消
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
//去相机
btnCarema.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PhotoSelectUtil.get().goToCamera(PersonInfoActivity.this);
popupWindow.dismiss();
}
});
//去相册
btnPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PhotoSelectUtil.get().goToPhoto(PersonInfoActivity.this);
popupWindow.dismiss();
}
});
}
跳转到相册进行相关操作
public void goToCamera(Activity context) {
Log.e(TAG, "goToCamera: 打开系统相机" );
//创建拍照储存的图片文件
DATE = new SimpleDateFormat("yyyy_MMdd_hhmmss").format(new Date());
if (isSdCardExist()) {
imagePath = FileUtil.createImagePath(APP_NAME + DATE);
File file = new File(imagePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
//跳转到系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
//设置7.0中共享文件,分享路径定义在xml/file_paths.xml
// 这个需要在 AndroidManifest.xml配置一下
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//通过FileProvider创建一个content类型的Uri
Uri contentUri = FileUtil.getFileUri(context, file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
} else {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
}
try {
context.startActivityForResult(intent, REQUEST_CAPTURE);
} catch (ActivityNotFoundException anf) {
ToastUtils.show(context,
context.getResources().getString(R.string.camera_not_prepared));
}
} else {
ToastUtils.show(context,
context.getResources().getString(R.string.sdcard_no_exist));
}
}
跳转到相册进行操作
public void goToPhoto(Activity activity) {
Log.e(TAG, "goToPhoto: 打开系统相册" );
DATE = new SimpleDateFormat("yyyy_MMdd_hhmmss").format(new Date());
if (isSdCardExist()) {
Intent intent;
if (Build.VERSION.SDK_INT < 19) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
} else {
intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
activity.startActivityForResult(intent, REQUEST_PICK);
}else {
ToastUtils.show(activity,activity.getResources().getString(R.string.sdcard_no_exist));
}
}
选择完图片并剪裁后会将图片带过来通过onActivityResult获取路径
public void onActivityResult(Activity activity, int requestCode, int resultCode
, Intent data, OnResultListener listener) {
switch (requestCode) {
case REQUEST_CAPTURE://相机
if (!TextUtils.isEmpty(imagePath)) {
File file = new File(imagePath);
if (file.isFile() && listener != null)
listener.takePhotoFinish(imagePath);
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, FileUtil.getFileUri(activity, file)));//Uri.fromFile(file)));
}
break;
case REQUEST_PICK://相册
if (data!=null){
Uri uri = data.getData();
if (uri != null) {
String cropImagePath = FileUtil.getRealFilePathFromUri(activity.getApplicationContext(), uri);
File file = new File(cropImagePath);
if (file.isFile() && listener != null)
listener.selectPictureFinish(cropImagePath);
}
}
break;
case REQUEST_CROP_PHOTO:
if (!TextUtils.isEmpty(crop_image)) {
File file = new File(crop_image);
Log.e(TAG, "onActivityResult: "+file.isFile());
if (file.isFile() && listener != null) {
listener.cropPictureFinish(crop_image);
}
// 最后通知图库更新
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,FileUtil.getFileUri(activity,file)));// Uri.fromFile(file)));
}
break;
}
}
public interface OnResultListener {
//拍照回调
void takePhotoFinish(String path);
//选择图片回调
void selectPictureFinish(String path);
//截图回调
void cropPictureFinish(String path);
}
在activity内调接口
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
PhotoSelectUtil.get().onActivityResult(PersonInfoActivity.this, requestCode, resultCode, data, new PhotoSelectUtil.OnResultListener() {
@Override拍照回调
public void takePhotoFinish(String path) {
PhotoSelectUtil.get().cropPicture(PersonInfoActivity.this, path, 1, 1);
}
@Override相册回调
public void selectPictureFinish(String path) {
PhotoSelectUtil.get().cropPicture(PersonInfoActivity.this, path, 1, 1);
}
@Override//裁图
public void cropPictureFinish(String path) {
//获取到图片路径,进行上传
GlideUtils.loadImageViewCircleImg(this, path, userTouxiangUpdate,R.drawable.ic_xinxitouxi);
}
});
}
至此结束,详细代码可以移步githup
https://github.com/Lei6/HeadPortraitUpload2