-
最近在项目中用到了照相和相册取图剪裁上传头像,就在网上逛了逛,基本都是千篇一律,就弄下来用了用,没想到的是各种各样的奇葩问题就出现了。先给大家看看代码问题慢慢来解决
这是调用相机
12345678910public
static
File getImageFromCamer(Context context, File cameraFile,
int
REQUE_CODE_CAMERA, Intent intent) {
intent =
new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File fileDir = HelpUtil.getFile(context,
"/Tour/user_photos"
);
cameraFile =
new
File(fileDir.getAbsoluteFile() +
"/"
+ System.currentTimeMillis() +
".jpg"
);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA);
return
cameraFile;
}
下面是调用相册
1234567public
static
void
getImageFromPhoto(Context context,
int
REQUE_CODE_PHOTO) {
Intent intent =
new
Intent(Intent.ACTION_PICK,
null
);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*"
);
((Activity) context).startActivityForResult(intent, REQUE_CODE_PHOTO);
}
123456789101112131415161718192021222324252627282930313233343536@Override
protected
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
if
(resultCode == RESULT_OK) {
switch
(requestCode) {
case
ConstantUtil.REQUE_CODE_CAMERA:
uri = Uri.fromFile(cameraFile);
PhotoUtil.startPhotoZoom(context, uri,
ConstantUtil.REQUE_CODE_CROP);
break
;
case
ConstantUtil.REQUE_CODE_PHOTO:
if
(
null
!= data) {
//为了取消选取不报空指针用的
uri = data.getData();
PhotoUtil.startPhotoZoom(context, uri,
ConstantUtil.REQUE_CODE_CROP);
}
break
;
case
ConstantUtil.REQUE_CODE_CROP:
if
(uri==
null
){
break
;
}
cropBitmap=HelpUtil.getBitmapFromUri(uri,context);
if
(cropBitmap !=
null
) {
iv_headphoto.setImageBitmap(cropBitmap);
baos =
new
ByteArrayOutputStream();
cropBitmap.compress(Bitmap.CompressFormat.JPEG,
100
, baos);
headPicString =
new
String(Base64.encode(
baos.toByteArray(),
0
));
UploadPic(headPicString);
}
break
;
default
:
break
;
}
}
1234567891011121314151617181920212223public
static
void
startPhotoZoom(Context context, Uri uri,
int
REQUE_CODE_CROP) {
int
dp =
500
;
Intent intent =
new
Intent(
"com.android.camera.action.CROP"
);
intent.setDataAndType(uri,
"image/*"
);
// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra(
"crop"
,
"true"
);
intent.putExtra(
"scale"
,
true
);
// 去黑边
intent.putExtra(
"scaleUpIfNeeded"
,
true
);
// 去黑边
// aspectX aspectY 是宽高的比例
intent.putExtra(
"aspectX"
,
1
);
//输出是X方向的比例
intent.putExtra(
"aspectY"
,
1
);
// outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死
intent.putExtra(
"outputX"
, dp);
//输出X方向的像素
intent.putExtra(
"outputY"
, dp);
intent.putExtra(
"outputFormat"
, Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(
"noFaceDetection"
,
true
);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra(
"return-data"
,
false
);
//设置为不返回数据
((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP);
}
在很多博客中都把“return-data”设置为了true然后在onActivityResult中通过data.getParcelableExtra(“data”)来获取数据,不过这样的话dp这个变量的值就不能太大了,不然你的程序就挂了。这里也就是我遇到问题的地方了,在大多数高配手机上这样用是没有问题的,不过很多低配手机就有点hold不住了,直接就异常了,包括我们的国产神机米3也没能hold住,所以我建议大家不要通过return data 大数据,小数据还是没有问题的,说以我们在剪切图片的时候就尽量使用Uri这个东东来帮助我们。
下面是我们进行剪裁用到的一些参数
Exta Options Table for image/* crop:
SetExtra DataType Description crop String Signals the crop feature aspectX int Aspect Ratio aspectY int Aspect Ratio outputX int width of output created from this Intent outputY int width of output created from this Intent scale boolean should it scale return-data boolean Return the bitmap with Action=inline-data by using the data data Parcelable Bitmap to process, you may provide it a bitmap (not tested) circleCrop String if this string is not null, it will provide some circular cr MediaStore.EXTRA_OUTPUT (“output”) URI Set this URi to a File:///, see example code
最后把通过Uri获得bitmap的方法给大家贴上
1234567891011121314public
static
Bitmap getBitmapFromUri(Uri uri,Context mContext)
{
try
{
// 读取uri所在的图片
Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
return
bitmap;
}
catch
(Exception e)
{
e.printStackTrace();
return
null
;
}
}
Android照相、相册获取图片剪裁报错的解决方案
最新推荐文章于 2023-07-15 20:00:00 发布