(已解决)程序调用魅族系统裁剪之后直接闪退

(已解决)程序调用魅族系统裁剪之后直接闪退


说明

几天前发布了一篇博客,是关于程序调用魅族系统裁剪之后直接闪退的问题,在网上找了很久之后也没有找到解决方法,于是决定去请教魅族官方的开发者,我先是在魅族社区里发帖提问,然后有幸在朋友的帮助下得到了魅族运营的联系方式,请求他帮忙联系一下魅族开发者,果然,在一周之后我得到了魅族开发者的回复,我在这里为魅族开发者点赞,感谢他们对待问题的态度,同时也为魅族客服点赞,感谢他们对用户提出的问题进行认真的回复。

好了,废话不多说,今天主要讲讲对于这个问题的解决方案。

魅族官方社区的回复截图

Bug solution screenshot
根据回复,我们可以得知,魅族在系统层就处理了 我们经常遇到的 因裁剪图片过大可能会导致内存溢出的问题,这一点还是挺人性化的,再次为魅族系统开发者点赞。

回复中共提供了三种解决方案,通过对比,我们把这三种方案进行结合。

解决方案代码如下:

/**
 * 对选择的图片进行裁剪
 * @param uri 图片uri
 * @param outputX 输出图片宽度
 * @param outputY 输出图片高度
 * @param requestCode 请求码
 */
public void cropImage(Uri uri, int outputX, int outputY, int requestCode) {
    Intent intent = 
        new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("noFaceDetection", true);
    intent.putExtra("return-data", true);
    //这里增加第三种方案的代码
    intent.putExtra("return-path-if-too-large", true);
    intent.putExtra("scale", true);
    //这里生成裁剪过后的图片的保存路径
    File file = new File(
        getApplicationContext().getExternalCacheDir(),
        UUID.randomUUID().toString());

    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    intent.putExtra("outputFormat", 
        Bitmap.CompressFormat.JPEG.toString()); //输入文件格式
    startActivityForResult(intent, requestCode);

    //把自定义的保存路径保存到全局变量中,方便其他地方调用
    this.mCropImageUri = Uri.fromFile(file);
}

覆写的onActivityResult代码如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {

        //裁剪图片之后的处理
        case REQUEST_CROP_CODE:
            if (resultCode == RESULT_OK && data != null){
                Uri uri = data.getData();
                if (uri != null) {
                    this.mImageRealPath = uri.getPath();
                    LogUtil.d("ImageRealPath==>", mImageRealPath);
                    //更换视频封面
                    img_video_mask.setImageURI(uri);

                } else {
                    //在其他机型上裁剪过后的图片uri会包含在data中,
                    //通过data.getData()可以获取到裁剪过后的图片uri
                    //但在魅族机型上,data.getData获取的uri为null
                    //因此需要使用我们在调用裁剪时生成的保存路径
                    this.mImageRealPath = 
                        mCropImageUri.getPath();
                    LogUtil.d(TAG, 
                        "onActivityResult: ImageRealPath==>" 
                        + mImageRealPath);

                    img_video_mask.setImageURI(mCropImageUri);

                }
            }
            break;

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

作者:zhongzilu
原文地址: http://zhongzilu.github.io/(已解决)程序调用魅族系统裁剪之后直接闪退/

本文总阅读量