android系统自带图片裁剪的注意事项(E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!)

转载请注明出处:(http://blog.csdn.net/qq_35071078/article/details/72835876

最近的项目中用到了图片裁剪的功能,所以用到了系统自带的裁剪功能代码如下:(现在的思路是这样的,首先传入需要裁剪的图片的Uri,给系统自带的图片裁剪activity,然后进入到这个activity,当裁剪完成后,返回,在我们自己的activity调用onActivityResult,通过intent获取返回的bitmap,这个思路一般的机型没有问题,但是少部分机型会出现问题,比如我的这个小米测试机。)

    /**
     * 裁剪图片,进入系统自带的activity
     *
     * @param uri
     */
    private void cropPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        Uri cropUri = Uri.fromFile(new File(
                Environment.getExternalStorageDirectory().getPath() + "/fc/crop/club.png"));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 150);
        intent.putExtra("outputY", 150);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, 3);
    }

然后通过通过系统自带的剪裁activity返回的intent(onActivityResult)来获取bitmap。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:

                break;
            case 2:

                break;
            case 3:
                if (data != null) {
                    final File file = new File(
                            Environment.getExternalStorageDirectory().getPath() + "xxx.png");
                    new Thread() {
                        @Override
                        public void run() {
                            photo = HttpAssist.uploadFile(file);
                        }
                    }.start();
                    Bundle extras = data.getExtras();
                    head = extras.getParcelable("data");
                    if (head != null) {
                        /**
                         *
                         * 上传服务器代码
                         *
                         */
                        //setPicToView(head);//保存在SD卡中
                        mImg.setImageBitmap(head);//用ImageView显示出来
                    }
                }
                break;

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

一般的机型不会出问题,但是在我的测试机mui8.2上出现了问题,报出的错误信息为:E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!出现问题的地方在返回的intent,intent无法返回图片数据,是一个空的intent,类似这样”data{ }”,这就是返回的data(intent类型的对象),是空的。目前还不知道哪些机型会出现同样的状况,所以代码改成如下:

    /**
     * 裁剪图片
     *
     * @param uri
     */
    private void cropPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        Uri cropUri = Uri.fromFile(new File(
                Environment.getExternalStorageDirectory().getPath() + "xxx.png"));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 150);
        intent.putExtra("outputY", 150);


        /**
         * 此方法返回的图片只能是小图片(sumsang测试为高宽160px的图片)
         * 故将图片保存在Uri中,调用时将Uri转换为Bitmap,此方法还可解决miui系统不能return data的问题
         *  intent.putExtra("return-data", true);
         */
        Uri uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "xxx.png");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
        //intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());


        startActivityForResult(intent, 3);
    }

原理就是通过系统自带的裁剪activity,直接将裁剪后的图片保存在SDCard中或者某个路径中,然后直接在其他地方通过这个路径来读取图片,而不是在返回的intent中去除bitmap,这样就ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值