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

来源:互联网 发布:js object to list 编辑:程序博客网 时间:2024/05/20 09:26

转载请注明出处:(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了。

阅读全文
3 0
原创粉丝点击