失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android头像上传时裁剪图片过大问题 裁剪大图片导致

Android头像上传时裁剪图片过大问题 裁剪大图片导致

时间:2022-04-16 22:03:49

相关推荐

Android头像上传时裁剪图片过大问题 裁剪大图片导致

原先在完成头像上传功能的时候复制网上写好的代码,虽然也仔细研究过实现的过程但是这次项目中却遇到了一个很不解的问题,使用乐视手机实现图片裁剪的那一步骤中由于图片太大手机性能不够导致图片无法裁剪报出错误

异常:Caused by: android.os.TransactionTooLargeException 导致原因是:Binder传输的数据太大 如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出TransactionTooLargeException。 解决方法: 不要将大量数据传入Binder,使用其他方式实现裁剪 以下是我在使用裁剪方法中写入的代码:

private void startPhotoZoom(Uri uri, int size) {

/* Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(uri, "image/*");

intent.putExtra("crop", "true");

// aspectX aspectY 是宽高的比例

intent.putExtra("aspectX", 1);

intent.putExtra("aspectY", 1);

Log.i("xiaoqiang", "裁剪111");

// outputX outputY 是裁剪图片宽高

intent.putExtra("outputX", size);

intent.putExtra("outputY", size);

intent.putExtra("return-data", true);

startActivityForResult(intent, 3);

}

可以看到我设置的 return-data为true,也就是说系统相册 会在onActivityForRestlt方法中通过Intent把头像数据传给我们,然后我们通过Bundle拿到系统相机或相册给的Extras在进行设置Image,代码如下:

private void setPicToView(Intent picdata) {

Bundle extras = picdata.getExtras();

if (extras != null) {

Log.i(TAG, "setPicToView: extras.getParcelable" + extras.getParcelable("data"));

Bitmap photo = extras.getParcelable("data")

if (photo != null) {

my_set_head.setImageBitmap(photo);

}

}

}

在这个过程中如果图片数据很小并且手机性能不错的话是不会报出任何错误,但是如果图片太大3m左右手机再差一点的话就会报出上面描述的错误

解决方案:

1.设置不接受返回数据(数据不以bitmap形式返回)

intent.putExtra("return-data", flase);

2.设置保存路径(图片输出路径,这样图片就会保存到咱们制定的uri路径)

intent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri);

3.使用BitmapFactory获取路径下的文件图片,设置到图片上

以调用相册图片裁剪显示在界面上为例,详细代码实现代码如下:

点击调用吊起相册功能,会返回用户先定的那种图片的uri

Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");startActivityForResult(intent, 2);

拿到用户选定的图片的uri执行裁剪操作

if (requestCode == 2) {// 相册 Log.i(TAG, "相册"); if (intent != null) {Uri uri = intent.getData(); startPhotoZoom(uri, 150); }}

设置裁剪的大小以及设置无返回值和保存路径

private void startPhotoZoom(Uri uri, int size) {Log.i(TAG, "裁剪"); Intent intent = new Intent("com.android.camera.action.CROP"); intent.putExtra("crop", "true"); Log.i(TAG, "startPhotoZoom: uri==" + uri); intent.setDataAndType(uri, "image/*"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", size); intent.putExtra("outputY", size); intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri); intent.putExtra("return-data", false); //裁剪后的数据不以bitmap的形式返回 startActivityForResult(intent, 3);}

然后拿tempuri转换成bitmap展示,然后也可以执行上传服务器的操作依情况而定

Bitmap bm = BitmapFactory.decodeFile(tempFile.getAbsolutePath());my_set_head.setImageBitmap(bm);

上传服务器

try {UpdateUserHeadImg(tempFile);// 上传头像} catch (Exception e) {//TODO Auto-generated catch block e.printStackTrace();}

代码已上传,下载地址:/detail/xiaoqiang_0719/9665601

如果觉得《Android头像上传时裁剪图片过大问题 裁剪大图片导致》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。