在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;}
}

另外对于图片处理:目前比较不错的框架  我推荐 facebook 的  fresco 地址介绍 http://www.fresco-cn.org/

另外 android  开发的小伙伴们 可以加 我们的qq群 交流问题 :  android  开发经验交流群:454430053

android 拍照,图库,相册,上传相关推荐

  1. Unity Android通过拍照和相册上传头像(图片)

    Unity点击按钮调用AS中显示对话框选择是从相册中上传还是拍照上传,如果是相册直接获得路径传给Unity使用,如果是拍照,先拍照保存在本地,再将路径传递给Unity使用 Android中提供了Int ...

  2. Android 拍照以及相册中选择(适配高版本)————上传多张照片之压缩处理、在线预览可伸缩放大(二)

    ______ Introduction ______ 前言 上一篇文章刚给大家总结完,关于上传头像的功能.此文章所述 主要是关于上传头像的具体流程以及如何对照片做裁剪处理,回调给控件显示:当然重中之重 ...

  3. Android 拍照和相册选择

    前几天一直在想写一个简单干净的关于Android 拍照和相册选择的dome,直到今天才有时间去写,下面是图片介绍,资源代码会有上传!供初学者学习指教(代码是Android studio) 1.控件 0 ...

  4. android 与后台实时视频,android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 首先第一步打开打开相册选择视频文件: Intent intent = new In ...

  5. uniapp 调用手机相机拍照实现图片上传

    uniapp 调用手机相机拍照实现图片上传 参考资料:https://blog.csdn.net/weixin_46391646/article/details/108450898 调用相机相册 un ...

  6. android点击加号,Android仿微信图片上传带加号且超过最大数隐藏功能

    1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 ...

  7. android+nutz后台如何上传和下载图片

    android+nutz后台如何上传和下载图片 发布于 588天前  作者 yummy222  428 次浏览  复制  上一个帖子  下一个帖子  标签: 无 最近在做一个基于android的app ...

  8. Centos配置Jenkins实现Android自动打包并上传到蒲公英

    本篇文章来自 徐永红  的投稿,给大家讲解Centos配置Jenkins实现Android自动打包并上传到蒲公英,希望对大家有所帮助. 徐永红 的博客地址: https://xuyonghong.cn ...

  9. Android + https 实现 文件上传

    Android 应用中,如何使用https 实现 文件上传功能. package com.example.wbdream.zigvine;import android.annotation.Suppr ...

  10. php调用本地摄像头,javascript 调用本地摄像头拍照 ajax提交上传

    最近在做一个小应用,里面有一个功能就是需要打开摄像头拍照并且上传,今天就记录一下这个小功能. HTML篇: 这里我是用的layui的样式,需要先引用layui的样式,才会有上图的效果. * 照片: 点 ...

最新文章

  1. MySQL服务器的配置教程
  2. jquery动态生成SKU表格
  3. 操作系统——文件合并
  4. 查看端口被哪个进程占用
  5. 百度首页html简单代码_百度站长平台为什么要验证网站及验证方法
  6. Docker最全教程之使用Docker搭建Java开发环境(十八)
  7. libsvm python_LibSVM for Python 使用
  8. Python计算校验文件的MD5、SHA1、SHA256和CRC32,获取文件创建日期、修改日期和文件大小
  9. 带你学会区分Scheduled Thread Pool Executor 与Timer
  10. linux中如何分割字符串数组中,关于bash:linux shell脚本:拆分字符串,将它们放入一个数组中,然后循环遍历它们...
  11. matlab算法knn算法,MATLAB KNN算法
  12. 使用R语言做极大似然估计
  13. 三菱FX3U与三菱变频器 modbus RTU通讯案例 采用485方式,modbus RTU协议。 与变频器通讯,控制启停,频率,加减速时间设定,频率
  14. 深 入 认 识 WIN95 注 册 表
  15. 创新产业发展战略:大前研一
  16. 导航系统中里程计研究综述
  17. php todo和其他备注,帮助 | 高效ToDo
  18. 专访 | 腾讯公司副总裁王巨宏:培养新兴开源力量,为中国技术自主创新添砖加瓦...
  19. 新浪sae部署微信订阅号
  20. Python 错题本

热门文章

  1. Python面向对象子类中重用父类的属性
  2. 大视野1898--Swamp 沼泽鳄鱼
  3. 笑脸检测笑脸识别微笑识别大笑识别
  4. 基于 Vue3.0 和 Ant Design Vue ,高颜值管理后台UI框架vue-vben-admin运行
  5. 用OneTab减少Chrome内存消耗
  6. 古诗词 中文 分词 自动化
  7. 螺旋线java_java怎么画布画阿基米螺旋线
  8. Circum Triangle(圆上三角形)
  9. Excel如何快速合并相同单元格
  10. 舌尖上的中国第二季整理笔记