1.获取图片
(1)获取本地图片
Intent intentFromGallery = null;
//因4.4版本不同 所以两种URI
//4.4以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
intentFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intentFromGallery.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
} else {
//4.4以下
intentFromGallery = new Intent();
intentFromGallery.setType("image/*");// 设置文件类型
intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); // 这个ACTION会调用相应文件类型的程序打开该文件
intentFromGallery.addCategory(Intent.CATEGORY_OPENABLE);
}
startActivityForResult(intentFromGallery, Constants.IMAGE_AVATAR_REQUEST_CODE);
(2)拍照获得图片
private File cameraFile;
<pre name="code" class="java">private static String IMAGE_AVATAR_FILE_NAME = Constants.IMAGE_FILE_NAME;//这里只是写了一个静态常量,用于设置图片的路径
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 启动Camera // 判断存储卡是否可以用,可用进行存储 if (CommonUtil.hasSdcard()) { File file = new File(Environment.getExternalStorageDirectory() + File.separator + Constants.IMAGE_FILE_FOLDER);//文件 if (!file.exists()) { file.mkdirs();// 创建文件夹 如果没有的话 } //当前时间 Date date = new Date(); date.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssS"); String timestr = sdf.format(date);
//随机数
Random rad = new Random(); int a = rad.nextInt(100); Log.e("", "time" + timestr + "_" + a); //由随机数和时间产生一个照片的名 IMAGE_AVATAR_FILE_NAME = timestr + "_" + a; cameraFile = new File(Environment.getExternalStorageDirectory() + File.separator + Constants.IMAGE_FILE_FOLDER + File.separator + IMAGE_AVATAR_FILE_NAME + ".jpg"); Uri imgUri = Uri.fromFile(cameraFile); intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); startActivityForResult(intentFromCapture, Constants.CAMERA_AVATAR_REQUEST_CODE); }
这里的请求码随意设置,只用于标识了啦
2.剪裁图片代码
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// CROP
intent.putExtra("crop", "true");
intent.putExtra("scale", true);// 去黑边
intent.putExtra("scaleUpIfNeeded", true);// 去黑边
// aspectX aspectY 是宽高的比例?边框?
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 320);
intent.putExtra("return-data", true);//这个如果是true intent里会有一个bitmap 在调用的时候 Bitmap photo = extras.getParcelable("data");得到,但只能是小bitmap太大出bug
//用这个方法可以传大图片 在接收的地方用uri 再转bitmap
// intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
// intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
// uriTemp = uri;
startActivityForResult(intent, Constants.RESULT_AVATAR_REQUEST_CODE);
}
3.保存剪裁之后的图片数据
private void getImageToView(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(photo);
//定义一个ImageView imgAvatar 显示裁剪之后的图片
imgAvatar.setImageDrawable(drawable);
//把base64存起来
String base64Avatar = CommonUtil.bitmapToString(photo);
//把头像存到sharedpreferences里一份
CommonUtil.saveAvatarString(mContext, base64Avatar);
//可以在这里把头像上传到后台
// UploadImgAndGetImgUrl mUploadGetUrl = new UploadImgAndGetImgUrl(photo, Constants.JPG, new OnAvatarGotListener());
//上传 会在回调里给一个url
// mUploadGetUrl.uploadAndGetTask();
//mProgressDialogLogo.show();
//ToastUtil.showToastShort(mContext, "图片上传中");
}
}
4.在onActivityResult中操作
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 结果码不等于取消时候
if (resultCode != RESULT_CANCELED) {
switch (requestCode) {
//从相册回来
case Constants.IMAGE_AVATAR_REQUEST_CODE:
startPhotoZoom(data.getData());// data.getDAta() uri
break;
//从相机回来
case Constants.CAMERA_AVATAR_REQUEST_CODE:
//查看是否有SD卡
if (CommonUtil.hasSdcard()) {
startPhotoZoom(Uri.fromFile(cameraFile));
// Uri fileUri=ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_FILE_NAME);
// Uri fileUri=Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()+File.separator+IMAGE_FILE_NAME);
// startPhotoZoom(fileUri);
} else {
ToastUtil.showToastShort(mContext, "未找到存储卡,无法存储照片!");
}
break;
case Constants.RESULT_AVATAR_REQUEST_CODE:
//从剪裁回来
if (data != null) {
getImageToView(data);
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
实际操作过程中遇到了一个问题,那就是用相机拍照之后点击对号,不能跳转至裁剪界面,(你以为是机型不匹配问题? NO!你以为是路径不行?NO!)麻蛋!清单文件中要加获得路径的权限!
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
就是这个啦.....大家引以为戒哦
小菜鸟学习ing...