程序调用魅族系统j裁剪之后直接闪退

程序调用系统裁剪之后直接闪退

说明

我原本是想实现更换头像的功能,程序调用系统相册选取图片,选取图片后直接进行裁剪,我在Activity里覆写了onActivityResult方法,然后在该方法里获取返回的图片数据,结果要么是根本没执行到onActivityResult方法里,要么是获取不到数据,在其他手机上没出现这个问题,唯独在魅族的手机上会有这个问题,我想请问一下魅族的开发者大佬们,这个问题该怎么解决呢?

具体描述

有两种情况,第一种没执行到onActivityResult

裁剪请求代码如下:

/**
  * 对选择的图片进行裁剪
  * @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("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);
 }

覆写的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);
                }
            }
            break;
     }

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

这种情况就是没法运行到onActivityResult方法里,裁剪图片之后,点击确定按钮,就直接闪退了,在debug模式下都没办法

第二种情况是能运行到onActivityResult里,但获取不了返回数据

裁剪请求代码稍微有点区别,具体如下:

/**
 * 对选择的图片进行裁剪
 * @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("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);
}

覆写的onActivityResult也稍微有点变化,具体代码如下:

//裁剪图片之后的处理
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 {
           Bundle bundle = data.getExtras();
           if (bundle != null) {
               String filePath = bundle.getString("filePath");
               if (!TextUtils.isEmpty(filePath)){
                   img_video_mask.setImageURI(
                       Uri.parse(filePath));
               }
            }
        }
    }
    break;

之所以改成这样的写法,是因为我在网上找到一篇文章在说这个问题,并给出一个解决方案,我根据他的解决方案,依然没有解决问题。地址:http://www.cnblogs.com/over140/archive/2012/12/17/2821874.html

在Debug模式下,截图如下
Debug Screenshot

通过截图可以看到urifilePath都为null,实在没办法,所以来请教一下魅族的开发大佬们,希望能尽快收到你们的回复,小弟在此表示万分感谢!

作者:zhongzilu
原文地址https://zhongzilu.github.io/2016/08/30/程序调用魅族系统裁剪之后直接闪退/

本文总阅读量