博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一站式解决,Android 拍照 图库的各种问题.
阅读量:4556 次
发布时间:2019-06-08

本文共 8547 字,大约阅读时间需要 28 分钟。

  在android开发中, 在一些编辑个人信息的时候,经常会有头像这么一个东西,就两个方面,调用系统相机拍照,调用系统图库获取图片.但是往往会遇到各种问题:

1.oom 

2.图片方向不对

3.activity result 的时候data == null

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

嘿嘿..开代码:

首先是调用系统拍照,和图库的代码

package com.chzh.fitter.util;import java.io.File;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.provider.MediaStore;import android.widget.Toast;//在onActivityResult方法中根据requestCode和resultCode来获取当前拍照的图片地址。//注意:这里有个问题,在有些机型当中(如SamsungI939、note2等)遇见了当拍照并存储之后,intent当中得到的data为空:/** * data = null 的情况主要是由于拍照的时候横屏了,导致重新create, 普通的解决方法可以在sharedpreference里面保存拍照文件的路径(onSaveInstance保存), * 在onRestoreSaveInstance里面在获取出来. * 最简单的可以用fileUtil 里面的一个静态变量保存起来.. * */public class CameraUtil {	private static final String IMAGE_TYPE = "image/*";	private Context mContext;	public CameraUtil(Context context) {		mContext = context;	}	/**	 * 打开照相机	 * @param activity 当前的activity	 * @param requestCode 拍照成功时activity forResult 的时候的requestCode	 * @param photoFile 拍照完毕时,图片保存的位置	 */	public void openCamera(Activity activity, int requestCode, File photoFile) {		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));		activity.startActivityForResult(intent, requestCode);	}	/**	 * 本地照片调用	 * @param activity	 * @param requestCode	 */	public void openPhotos(Activity activity, int requestCode) {		if (openPhotosNormal(activity, requestCode) && openPhotosBrowser(activity, requestCode) && openPhotosFinally());	}	/**	 * PopupMenu打开本地相册.	 */	private boolean openPhotosNormal(Activity activity, int actResultCode) {		Intent intent = new Intent(Intent.ACTION_PICK, null);		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,				IMAGE_TYPE);		try {			activity.startActivityForResult(intent, actResultCode);		} catch (android.content.ActivityNotFoundException e) {			return true;		}		return false;	}	/**	 * 打开其他的一文件浏览器,如果没有本地相册的话	 */	private boolean openPhotosBrowser(Activity activity, int requestCode) {		Toast.makeText(mContext, "没有相册软件,运行文件浏览器", Toast.LENGTH_LONG).show();		Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"		intent.setType(IMAGE_TYPE); // 查看类型 String IMAGE_UNSPECIFIED =									// "image/*";		Intent wrapperIntent = Intent.createChooser(intent, null);		try {			activity.startActivityForResult(wrapperIntent, requestCode);		} catch (android.content.ActivityNotFoundException e1) {			return true;		}		return false;	}	/**	 * 这个是找不到相关的图片浏览器,或者相册	 */	private boolean openPhotosFinally() {		Toast.makeText(mContext, "您的系统没有文件浏览器或则相册支持,请安装!", Toast.LENGTH_LONG).show();		return false;	}	/**	 * 获取从本地图库返回来的时候的URI解析出来的文件路径	 * @return	 */	public static String getPhotoPathByLocalUri(Context context, Intent data) {		Uri selectedImage = data.getData();		String[] filePathColumn = { MediaStore.Images.Media.DATA };		Cursor cursor = context.getContentResolver().query(selectedImage,				filePathColumn, null, null, null);		cursor.moveToFirst();		int columnIndex = cursor.getColumnIndex(filePathColumn[0]);		String picturePath = cursor.getString(columnIndex);		cursor.close();		return picturePath;	}}

  接下来是解决oom的

  

package com.chzh.fitter.util;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.IOException;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.media.ExifInterface;import android.net.Uri;import android.util.Log;import android.widget.ImageView;import com.androidquery.util.AQUtility;/** * @author jarrahwu * */public class ImageUtil {	/**	 * Utility method for downsampling images.	 *	 * @param path	 *            the file path	 * @param data	 *            if file path is null, provide the image data directly	 * @param target	 *            the target dimension	 * @param isWidth	 *            use width as target, otherwise use the higher value of height	 *            or width	 * @param round	 *            corner radius	 * @return the resized image	 */	public static Bitmap getResizedImage(String path, byte[] data, int target,			boolean isWidth, int round) {		Options options = null;		if (target > 0) {			Options info = new Options();			info.inJustDecodeBounds = true;			//设置这两个属性可以减少内存损耗			info.inInputShareable = true;			info.inPurgeable = true;			decode(path, data, info);			int dim = info.outWidth;			if (!isWidth)				dim = Math.max(dim, info.outHeight);			int ssize = sampleSize(dim, target);			options = new Options();			options.inSampleSize = ssize;		}		Bitmap bm = null;		try {			bm = decode(path, data, options);		} catch (OutOfMemoryError e) {			L.red(e.toString());			e.printStackTrace();		}		if (round > 0) {			bm = getRoundedCornerBitmap(bm, round);		}		return bm;	}	private static Bitmap decode(String path, byte[] data,			BitmapFactory.Options options) {		Bitmap result = null;		if (path != null) {			result = decodeFile(path, options);		} else if (data != null) {			// AQUtility.debug("decoding byte[]");			result = BitmapFactory.decodeByteArray(data, 0, data.length,					options);		}		if (result == null && options != null && !options.inJustDecodeBounds) {			AQUtility.debug("decode image failed", path);		}		return result;	}	private static Bitmap decodeFile(String path, BitmapFactory.Options options) {		Bitmap result = null;		if (options == null) {			options = new Options();		}		options.inInputShareable = true;		options.inPurgeable = true;		FileInputStream fis = null;		try {			fis = new FileInputStream(path);			FileDescriptor fd = fis.getFD();			// AQUtility.debug("decoding file");			// AQUtility.time("decode file");			result = BitmapFactory.decodeFileDescriptor(fd, null, options);			// AQUtility.timeEnd("decode file", 0);		} catch (IOException e) {			Log.error("TAG",e.toString())		} finally {			fis.close()		}		return result;	}	private static int sampleSize(int width, int target) {		int result = 1;		for (int i = 0; i < 10; i++) {			if (width < target * 2) {				break;			}			width = width / 2;			result = result * 2;		}		return result;	}	/**	 * 获取圆角的bitmap	 * @param bitmap	 * @param pixels	 * @return	 */	private static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {		Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),				bitmap.getHeight(), Config.ARGB_8888);		Canvas canvas = new Canvas(output);		final int color = 0xff424242;		final Paint paint = new Paint();		final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());		final RectF rectF = new RectF(rect);		final float roundPx = pixels;		paint.setAntiAlias(true);		canvas.drawARGB(0, 0, 0, 0);		paint.setColor(color);		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));		canvas.drawBitmap(bitmap, rect, rect, paint);		return output;	}	/**	 * auto fix the imageOrientation	 * @param bm source	 * @param iv imageView  if set invloke it's setImageBitmap() otherwise do nothing	 * @param uri image Uri if null user path	 * @param path image path if null use uri	 */	public static Bitmap autoFixOrientation(Bitmap bm, ImageView iv, Uri uri,String path) {		int deg = 0;		try {			ExifInterface exif = null;			if (uri == null) {				exif = new ExifInterface(path);			}			else if (path == null) {				exif = new ExifInterface(uri.getPath());			}			if (exif == null) {				Log.error("TAG","exif is null check your uri or path");				return bm;			}			String rotate = exif.getAttribute(ExifInterface.TAG_ORIENTATION);			int rotateValue = Integer.parseInt(rotate);			System.out.println("orientetion : " + rotateValue);			switch (rotateValue) {			case ExifInterface.ORIENTATION_ROTATE_90:				deg = 90;				break;			case ExifInterface.ORIENTATION_ROTATE_180:				deg = 180;				break;			case ExifInterface.ORIENTATION_ROTATE_270:				deg = 270;				break;			default:				deg = 0;				break;			}		} catch (Exception ee) {			Log.d("catch img error", "return");			if(iv != null)			iv.setImageBitmap(bm);			return bm;		}		Matrix m = new Matrix();		m.preRotate(deg);		bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);		//bm = Compress(bm, 75);		if(iv != null)			iv.setImageBitmap(bm);		return bm;	}}

  

  如果想要代码Demo的话,可以留言.有什么坑爹的地方,多多拍砖..over.

转载于:https://www.cnblogs.com/jarrah/p/3726079.html

你可能感兴趣的文章
计算储存、交互和语言
查看>>
bzoj2067: [Poi2004]SZN
查看>>
所谓独立环境
查看>>
当代GSM手机的硬件系统分析[zz]
查看>>
对我影响最深的三个老师
查看>>
开源项目托管GitHub
查看>>
Unity学习笔记—— 常用脚本函数
查看>>
.getCellType()的几种类型值
查看>>
linux中启动 java -jar 后台运行程序
查看>>
运行web项目端口占用问题
查看>>
Java Spring-IOC和DI
查看>>
【NOIP1999】【Luogu1015】回文数(高精度,模拟)
查看>>
Linux上安装Python3.5
查看>>
crt安装
查看>>
git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git
查看>>
c++中static的用法详解
查看>>
转 我修改的注册表,但是程序运行起来,还是记着以前的
查看>>
图片轮播功能
查看>>
第六周小组作业:软件测试和评估
查看>>
linux Cacti监控服务器搭建
查看>>