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了。

你可能感兴趣的:(android,图片,uri,MUI,intent-传递对象)