一,简单的一个类帮你搞定头像上传+裁切
(1)这是一个PhotoPresenter类直接封装好了
/**
*
* <p>
* TODO(拍照或选择照片实现类)
* </p>
* <br/>
*/
public class PhotoPresenter {
public static final int CANCEL_PHOTO_ACTION=0;
public static final int TAKE_PHOTO_ACTION = 1;
public static final int SELECT_PHOTO_ACTION = 2;
public static final int CUT_PHOTO_ACTION = 3;
private Context mContext;
private String mImagePath;
private ImageView mImage;
public PhotoPresenter(Context context, ImageView image) {
mContext = context;
mImagePath = 图片本地存储路径;//自己设置
mImage = image;
}
/**
*
* <p>
* TODO(用相机拍照)
* </p>
* <br/>
*/
public void takePhoto() {
// 用相机拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(mImagePath)));
((Activity) mContext).startActivityForResult(intent, TAKE_PHOTO_ACTION);
}
/**
*
* <p>
* TODO(从相册中选取图片)
* </p>
* <br/>
* <p>
* TODO(详细描述)
* </p>
*
* @since 1.0.0
* @author cherish
* @param context
*/
public void pickAlbum() {
Intent select_intent = new Intent(Intent.ACTION_PICK, null);
select_intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
((Activity) mContext).startActivityForResult(select_intent,
SELECT_PHOTO_ACTION);
}
/**
* 裁剪图片方法实现
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", true);
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
((Activity) mContext).startActivityForResult(intent, CUT_PHOTO_ACTION);
}
/**
* 此方法被Activity中onActivityResult回掉,Activity中方法写在下面了往后看
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SELECT_PHOTO_ACTION) { //相册中选取
if (data != null) {
startPhotoZoom(data.getData());
}
} else if (requestCode == TAKE_PHOTO_ACTION) { //相机拍照照片
File temp = new File(mImagePath);
if (temp.exists()) {
startPhotoZoom(Uri.fromFile(temp));
}
} else if (requestCode == CUT_PHOTO_ACTION) { //裁切完调用
if(resultCode==CANCEL_PHOTO_ACTION)
{
Toast.makeText(mContext, "已取消", Toast.LENGTH_SHORT).show();
}else
{
getImageToView(data);
}
}
}
/**
* 保存裁剪之后的图片数据
*
* @param picdata
*/
private void getImageToView(Intent data) {
if(data!=null)
{
final Bundle extras = data.getExtras(); //拿到图片
if (extras != null) {
new Thread(){
public void run() {
final Bitmap photo = extras.getParcelable("data");
FileUtils.saveImage(photo, mImagePath); //裁切完图片保存到本地
((Activity)mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
mOnImageSaveListener.onImageSave(mImagePath); //上传服务器(根据自己项目中网络请求提交)
mImage.setImageBitmap(photo); //绑定到控件
}
});
}
}.start();
}
}
}
//绑定头像接口
public interface OnImageSaveListener {
public void onImageSave(String imagePath);
}
}
(2)我们再来看一下Activity中方法
在Activity里面更具需求调用takePhoto()或者pickAlbum方法,一般写在弹窗里,然后在Activity里面写下面方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
new PhotoPresenter().onActivityResult(requestCode, resultCode, data); //回掉上面类方法
super.onActivityResult(requestCode, resultCode, data);
}
(3)图片文件上传到服务器
这里已经拿到了裁剪后的图片,根据自己项目中网络请求上传到服务器!