android照相、相册获取图片剪裁报错的解决方法


这是调用相机 

	public static File getImageFromCamer(Context context, File cameraFile,
			int REQUE_CODE_CAMERA, Intent intent) {
		intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		File fileDir = HelpUtil.getFile(context, "/Tour/user_photos");
		cameraFile = new File(fileDir.getAbsoluteFile() + "/"
				+ System.currentTimeMillis() + ".jpg");
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
		((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA);
		return cameraFile;
	}

在这里我返回了一个file对象,这是应为项目中需要,大家可以不必真写,直接传一个Uri对象过来就好了

 

下面是调用相册

 

public static void getImageFromPhoto(Context context, int REQUE_CODE_PHOTO) {
		Intent intent = new Intent(Intent.ACTION_PICK, null);
		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
				"image/*");
		((Activity) context).startActivityForResult(intent, REQUE_CODE_PHOTO);
 
	}

当然接下来是调用Activity的OnActivityResult了

 

 

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK) {
			switch (requestCode) {
			case ConstantUtil.REQUE_CODE_CAMERA:
				uri = Uri.fromFile(cameraFile);
				PhotoUtil.startPhotoZoom(context, uri,
						ConstantUtil.REQUE_CODE_CROP);
				break;
			case ConstantUtil.REQUE_CODE_PHOTO:
				if (null != data) {//为了取消选取不报空指针用的
					uri = data.getData();
					PhotoUtil.startPhotoZoom(context, uri,
							ConstantUtil.REQUE_CODE_CROP);
				}
				break;
			case ConstantUtil.REQUE_CODE_CROP:
				if(uri==null){
					break;
				}
				cropBitmap=HelpUtil.getBitmapFromUri(uri,context);
				if (cropBitmap != null) {
					iv_headphoto.setImageBitmap(cropBitmap);
 
					baos = new ByteArrayOutputStream();
					cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
					headPicString = new String(Base64.encode(
							baos.toByteArray(), 0));
					UploadPic(headPicString);
				}
 
				break;
			default:
				break;
			}
		}

当然还有大家关心的剪切

public static void startPhotoZoom(Context context, Uri uri,
			int REQUE_CODE_CROP) {
		int dp = 500;
 
		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);//输出是X方向的比例
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死
		intent.putExtra("outputX", dp);//输出X方向的像素
		intent.putExtra("outputY", dp);
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("noFaceDetection", true);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
		intent.putExtra("return-data", false);//设置为不返回数据
 
		((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP);
	}

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

下面是我们进行剪裁用到的一些参数

Exta Options Table for image/* crop:

 

SetExtra DataType Description
crop String Signals the crop feature
aspectX int Aspect Ratio
aspectY int Aspect Ratio
outputX int width of output created from this Intent
outputY int width of output created from this Intent
scale boolean should it scale
return-data boolean Return the bitmap with Action=inline-data by using the data
data Parcelable Bitmap to process, you may provide it a bitmap (not tested)
circleCrop String if this string is not null, it will provide some circular cr
MediaStore.EXTRA_OUTPUT ("output") URI Set this URi to a File:///, see example code


最后把通过Uri获得bitmap的方法给大家贴上

 

public static Bitmap getBitmapFromUri(Uri uri,Context mContext)
	 {
	 try
	 {
	  // 读取uri所在的图片
	  Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
	  return bitmap;
	 }
	 catch (Exception e)
	 {
	  e.printStackTrace();
	  return null;
	 }
	 }



相关阅读:
查看修改mysql编码方式让它支持中文(gbk或者utf8)
使用PHP和HTML5 FormData实现无刷新文件上传教程
三星笔记本(910S3K-K03)U盘装win7系统图文教程 三星笔记本u盘装win7
Javascript刷新窗口方法小结
jquery实现左右滑动菜单效果代码
微软正在内测win10 Build 10550版本 有望推送快速版
win10 Build 10108版本截图图赏:UI新的改进
Android实现将已发送的短信写入短信数据库的方法
c#委托学习示例分享
php实现MD5加密16位(不要默认的32位)
在Win10中回收站等桌面图标不见了怎么显示?
剖析标注HTML元素时class比id所具有的优势
Win10正式版哪些预装的应用可以卸载?Win10释放空间的详细教程
Win7系统双击Adminiatrator帐户提示“读取错误,工作站服务没有启动”的解决方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 固始-金华 济南-西乡 新和-疏勒河 深圳东-泰州 石门县北-上海南 伊春-扶余 诏安-漳浦 嘉兴南-高安 图们-大兴沟 乌鲁木齐南-驻马店 江山-遵义 敖头-开道 塔哈-太平川 嘉兴-光泽 鞍山西-高邑西 查布嘎-贺日斯台 郴州-宜城 渠县-济源 关岭-怀化南 瑞金-娄底 德州-大虎山 哈尔滨-乌鲁木齐南 上海南-邵武 沙湾县-张掖 长治-定州 神木-镇安 甘河-伊图里河 邵阳北-镇江南 上海南-共青城 云梦-宣汉 肥东-遂宁 遵义-分宜 穆棱-绥化 金华南-青田 赛汗塔拉-白音察干 伊敏-西索木 谷城-南昌 合肥南-五府山 永州-咸宁北 江桥-锦州 巴彦郭勒-楚鲁图 呼兰-威岭 三家寨-花家庄 衡水-渭南 乐武-沙马拉达 黑河-兴隆镇 广安-月山 郴州-沂南 六枝-淄博 齐齐哈尔-雅鲁 五家-长春 四方台-大庆东 襄阳-城固 彭水-松桃 韶关东-桂林北 五龙背-兴隆镇 南平南-常州 延安-郑州 广德号-汤头沟 喇嘛山-沈阳 好鲁库-伊和恩格拉 扶余-双城堡 北岗-姚千户屯 三门峡-渭南 武义-九江 道州-义乌 惠农-萨拉齐 涿州-平顶山西 南平北-玉山南 泰山-阿城 卫辉-三门峡 重庆北-潼南 来宾-祁东 怀仁-龙川 武昌-胶州 萧县北-潍坊 塔崖驿-王安镇 商丘南-涟源 茅草坪-花家庄 灵宝-东莞东 从阳江市区如何去珠海机场(最快捷的方式)
请问常平有到肇庆或者是怀集的车吗
求助~春节期间准备到杭州旅游,杭州的朋友给我推荐一下旅游
从平谷到东城朝阳门内大街的公交路线怎么坐车
北仲路到青岛动漫产业园怎么坐车
龙岩哪里有卖全新山地自行车的谢谢
泉州到广东中山的豪华卧铺车几个小时到
为何宁都没有封至瑞金宁都为何被称为文乡诗国
这啥车
请问从怀化到重庆没有客车吗
湖州到诸暨坐长途客车大概要多久,班次是怎么样的另外有
想知道: 大连市 从旅顺口区到大连市检察院司法警察支队怎么坐
广东今年考到553,进的了厦门大学嘉庚学院土木工程系
常州到通州的客车汽车有多少
寄东西蚌埠到武汉顺丰快递要多久
关于广东顺德家具和江西南康家具的问题
上海到扬州最晚的一班车是几点
我有大量黄金,到那卖价格最好
桂林的,桂林东方中等职业学校到广西城市建设学校有多少公里
从沙市到贵州遵义怎么坐车
快女黄英地家庭住址是达州渠县哪里啊???具体的哦
请问下我现在在浙江玉环要到四川泸州古蔺做那班汽车还有就是
从重庆到四川通江怎么坐车谢谢
火炬为什么不传到忻州
成都火车列车北站到成都三槐树街军转大厦公交车怎么走
南京至温州的动车_南京至温州的动车
从南昌到宜昌但是直达车要半夜坐车,不舒服。我想先到武汉然
从北京到湖南邵阳要多久呀
无牌无证的摩托车 由于闯红灯 且其没带头盔 撞到汽车客车前门 导
福州到西宁的最佳路线

Copyright © 2016 phpStudy |