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();
}

代码已上传,下载地址:http://download.csdn.net/detail/xiaoqiang_0719/9665601














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoqiang_0719

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值