您的位置:首页 > 移动开发 > Android开发

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

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

一般情况中的问题:

1.oom 

2.图片方向不对

3.activity result 的时候data == null

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

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

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







直接说怎么解决:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: