原先在完成头像上传功能的时候复制网上写好的代码,虽然也仔细研究过实现的过程但是这次项目中却遇到了一个很不解的问题,使用乐视手机实现图片裁剪的那一步骤中由于图片太大手机性能不够导致图片无法裁剪报出错误
/* Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
Log.i("xiaoqiang", "裁剪111");
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
可以看到我设置的 return-data为true,也就是说系统相册 会在onActivityForRestlt方法中通过Intent把头像数据传给我们,然后我们通过Bundle拿到系统相机或相册给的Extras在进行设置Image,代码如下:
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
if (extras != null) {
Log.i(TAG, "setPicToView: extras.getParcelable" + extras.getParcelable("data"));
Bitmap photo = extras.getParcelable("data")
if (photo != null) {
my_set_head.setImageBitmap(photo);
}
}
}
在这个过程中如果图片数据很小并且手机性能不错的话是不会报出任何错误,但是如果图片太大3m左右手机再差一点的话就会报出上面描述的错误
解决方案:
1.设置不接受返回数据(数据不以bitmap形式返回)
intent.putExtra("return-data", flase);
2.设置保存路径(图片输出路径,这样图片就会保存到咱们制定的uri路径)
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri);
3.使用BitmapFactory获取路径下的文件图片,设置到图片上
以调用相册图片裁剪显示在界面上为例,详细代码实现代码如下:
点击调用吊起相册功能,会返回用户先定的那种图片的uri
Intent intent = new Intent(
Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 2);
拿到用户选定的图片的uri执行裁剪操作
if (requestCode == 2) {// 相册
Log.i(TAG, "相册");
if (intent != null) {
Uri uri = intent.getData();
startPhotoZoom(uri, 150);
}
}
设置裁剪的大小以及设置无返回值和保存路径
private void startPhotoZoom(Uri uri, int size) {
Log.i(TAG, "裁剪");
Intent intent = new Intent("com.android.camera.action.CROP");
intent.putExtra("crop", "true");
Log.i(TAG, "startPhotoZoom: uri==" + uri);
intent.setDataAndType(uri, "image/*");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra("return-data", false); //裁剪后的数据不以bitmap的形式返回
startActivityForResult(intent, 3);
}
然后拿tempuri转换成bitmap展示,然后也可以执行上传服务器的操作依情况而定
Bitmap bm = BitmapFactory.decodeFile(tempFile.getAbsolutePath());
my_set_head.setImageBitmap(bm);
上传服务器
try {
UpdateUserHeadImg(tempFile);// 上传头像
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
代码已上传,下载地址:http://download.csdn.net/detail/xiaoqiang_0719/9665601