android 相机和相册获取相片剪裁报错问题解决,机型也解决

 背景:在上个星期,我想要做一个头像上传功能,然而我用的是华为手机,听说华为和小米的适配特别难做,果不其然,也有人建议我去自定义一个图片剪裁工具,当然有开源的我就直接用了。 也好使,但是我就是想要在原始的代码上去解决这个问题。结果也是解决了问题。

一般情况中的问题:

1.oom 

2.图片方向不对

3.activity result 的时候data == null

4.调用图库的时候没找到软件

以上的问题基本都解决了,但是我今天遇到的问题是第三个,data == null。这个的现象就是,照了相之后跳到图片剪裁,但是在剪裁哪儿剪裁之后就没有反应了,对,没有反应或者就是报错,报的是空指针。

先把做好的给你看看,我的是华为手机,嘿嘿,然后也有源码供你们下载。

android 相机和相册获取相片剪裁报错问题解决,机型也解决_第1张图片android 相机和相册获取相片剪裁报错问题解决,机型也解决_第2张图片android 相机和相册获取相片剪裁报错问题解决,机型也解决_第3张图片

直接说怎么解决:

1,在截图这儿的代码,中

intent.putExtra("return-data", false);//设置为不返回数据

在我看的很多博客中都把“return-data”设置为了true然后在onActivityResult中通过data.getParcelableExtra("data")来获取数据,不过这样的话dp这个变量的值就不能太大了,不然你的程序就挂了。这里也就是我遇到问题的地方了,在大多数高配手机上这样用是没有问题的,不过很多低配手机就有点hold不住了,直接就异常了,包括我们的国产神机小米也没能hold住,所以我建议大家不要通过return data 大数据,小数据还是没有问题的,说以我们在剪切图片的时候就尽量使用Uri这个东东来帮助我们。

     * 进行截图
     * @param context Activity上下文对象
     * @param uri  Uri
     * @param size  大小
     */
    public static void startPhotoZoom(Activity context,Uri uri, int size) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // crop为true是设置在开启的intent中设置显示的view可以剪裁
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);// 去黑边
        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // outputX,outputY 是剪裁图片的宽高
        intent.putExtra("outputX", size);
        intent.putExtra("outputY", size);

        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        </span><span style="color:#ff6666;">intent.putExtra("return-data", false);//设置为不返回数据

        context.startActivityForResult(intent, Configs.SystemPicture.PHOTO_REQUEST_CUT);
    }
2,就是在剪裁图片之后将图片result返回,
<span style="color:#373737;">@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case Configs.SystemPicture.PHOTO_REQUEST_TAKEPHOTO: // 拍照
                Log.i("iiiiiii","1232343");
                SelectHeadTools.startPhotoZoom(this,photoUri, 600);
                break;
            case Configs.SystemPicture.PHOTO_REQUEST_GALLERY://相册获取
                if (data !=null)
                    photoUri = data.getData();
                SelectHeadTools.startPhotoZoom(this, data.getData(), 600);
                break;
            case Configs.SystemPicture.PHOTO_REQUEST_CUT:  //接收处理返回的图片结果,这个过程比较重要
                Log.i("iiiiiii_cut","1232343");
                if (photoUri==null)
                    break;
                /*Bitmap bit = data.getExtras().getParcelable("data"); </span><span style="color:#ff6666;"> //不要再用data的方式了,会出现activity result 的时候data == null的空的情况
                try
                {
                    cropBitmap  = getBitmapFromUri(photoUri, this); /</span><span style="color:#ff6666;">//通过获取uri的方式,直接解决了报空和图片像素高的oom问题

                    if (cropBitmap != null) {
                        iv_show.setImageBitmap(cropBitmap);
                    }

                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

                //下面可以用来上传pc服务端
                File file = FileTools.getFileByUri(this,photoUri);
                Log.d("File",file.toString());
                break;
        }
    }

    public  Bitmap getBitmapFromUri(Uri uri,Context mContext)
    {
        try
        {
            </span><span style="color:#ff6666;">// 读取uri所在的图片</span><span style="color:#373737;">
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
            return bitmap;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
对,通过这样的方式就能解决该问题。

纪实:2016.2.22

源码地址:http://download.csdn.net/detail/syif88/9439230

以及自定义相片剪裁工具源码地址:http://download.csdn.net/detail/syif88/9439235

你可能感兴趣的:(相片剪裁报错,相片截图,获取相片通过照相和相册)