(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)图片文件上传到服务器这里已经拿到了裁剪后的图片,根据自己项目中网络请求上传到服务器!