源码部分分析

Camera.java → 点我定位,注意研究1134行与2023行的两个方法。

通过源码可以发现,输出的图片有2个分支

如果你没有指定Intent里面的Extra参数,它就返回一个序列化(putExtra(“data”, bitmap))的Bitmap,从理论上来说,这样的代码写的很烂,属于Magic Number。

如果你指定了Intent里面的Extra参数MediaStore.EXTRA_OUTPUT,拍照后它就直接把bitmap写到了Uri里面了,返回是空

一、获得拍照的预览图

使用范围:获得很小的预览图,用于设置头像等地方。
返回示例:bitmap = data.getExtras().getParcelable(“data”);

public final static int REQUEST_IMAGE_CAPTURE = 1;//start
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);//receive
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != RESULT_OK) {Log.d(TAG, "canceled or other exception!");return;}if (requestCode == REQUEST_IMAGE_CAPTURE) {Log.d(TAG, "REQUEST_IMAGE_CAPTURE");Bitmap bitmap;try {//"data"这个居然没用常量定义,也是醉了,我们可以发现它直接把bitmap序列化到intent里面了。bitmap = data.getExtras().getParcelable("data"); //TODO:do something with bitmap, Do NOT forget call Bitmap.recycler();mCameraImageview.setImageBitmap(bitmap);} catch (ClassCastException e){//do something with exceptionse.printStackTrace();} }}

二、获得原始的拍照文件

返回示例:

outputFileUri = file:///storage/sdcard0/JPEG_20150226_221320_-328629202.jpg

使用范围:用于处理大的图片,比如使用滤镜,上传原始图像等操作,注意Uri不要用data私有目录,否则相机是写不进去的。

Android N 以后的设备 ,在传递uri到其他app的时候,需要使用FileProvider,参考这篇文章

public final static int REQUEST_IMAGE_CAPTURE = 1;
Uri outputFileUri;//start@OnClick(R.id.itemSelectCamera) void itemSelectCamera() {File file = FileUtils.createImageFile();outputFileUri = Uri.fromFile(file);Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);startActivityForResult(captureIntent, REQUEST_IMAGE_CAPTURE);}//receive
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != RESULT_OK) {Log.d(TAG, "canceled or other exception!");return;}if (requestCode == REQUEST_IMAGE_CAPTURE) {Log.d(TAG, "REQUEST_IMAGE_CAPTURE");//TODO:Use the Uri Intent intent = new Intent(this, ImageFilterActivity.class);intent.setData(outputFileUri);startActivity(intent);}}

关于文件如何创建,目前我找到的就是这个最稳定了,写到SD卡根目录(每个手机位置都不一样,坑太多了),再说一遍,data目录(Context.getXXDir())是私有目录,其它程序(比如Camera)是写不进去的

public class FileUtils {public static File createImageFile() {// Create an image file nameString timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());String imageFileName = "JPEG_" + timeStamp + "_";try {File image = File.createTempFile(imageFileName,  /* prefix */".jpg",         /* suffix */Environment.getExternalStorageDirectory()      /* directory */);return image;} catch (IOException e) {//do notingreturn null;}}
}

三、获取Gallery里面的图片

一、调用系统相册App,浏览所用图片

 Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setType("image/*");startActivity(intent);

二、调用系统相册,并从中选择一张照片

Intent intent = new Intent();intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivityForResult(Intent.createChooser(intent, "Select Picture"),1);

三、调用系统相册查看单张(或特定)图片

 //下方是将ImageList集合中的图片路径转换为可供File识别的String数据,String value = String.valueOf(mImagesList.get(pos).getPicturePath());File file = new File(value);//下方是是通过Intent调用系统的图片查看器的关键代码Intent intent = new Intent();intent.setAction(android.content.Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(file), "image/*");startActivity(intent);

四、 Android 图片裁剪

//裁剪拍照后得到的图片private void cropImageUri(Uri uri, int requestCode) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");//intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 500);intent.putExtra("outputY", 500);intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);intent.putExtra("return-data", false);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionintent = Intent.createChooser(intent, "裁剪图片");startActivityForResult(intent, requestCode);}

完全掌握 Android 选择图片、拍照以及图片裁剪

参考:
Android——调用系统相册

超完整!Android获取图片的三种方法

Intent 和 Intent 过滤器

Intent

MediaStore.Images.Media

Android 调用相机APP获取拍照图片和从相册选择图片相关推荐

  1. MUI 拍照和从系统相册选择图片上传

    要完成用MUI 拍照和从系统相册选择图片上传的功能,可以理解成有三个功能 1 调用手机相机的功能(可以查看官方API  http://www.html5plus.org/doc/zh_cn/camer ...

  2. android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...

    这里主要是基于Android 7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径. 首先需要在AndroidManifest.xml声明调用相机的权 ...

  3. android调用相机后自动拍照

    b 合理使用requestAnimationFrame动画代替setTimeout 微服务 基于Mongodb分布式集做数据分析时,当前命令 IBM DB2 .比如路由器即不能有这种情况出现,赢得了各 ...

  4. 关于小米手机从系统相册选择图片的一个bug

    在开发应用的时候碰到一个问题,拍照或者从系统相册选择图片并上传,首先从相机或者相册获取图片并压缩处理,最后再上传,代码写好并基本测试通过,然而深度测试的时候却发现有一个问题. 在小米手机,即MIUI系 ...

  5. android 调用相机拍照。适配到 Android 10

    Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者   提 Bug 标签: android ...

  6. android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...

    Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...

  7. Android10(华为Mate30)获取图片路径失败,拍照或从相册选择图片后无法显示

    在使用华为Mate30是从图库选择图片,本地无法显示,其他手机没问题,发现是兼容Android10的问题,Android10下本app的私有文件是不需要权限的,访问其他应用权限需要权限 android ...

  8. 学习笔记之Android调用系统相册选择图片

    文章目录 前言 使用步骤 小结 参考资料 前言 在相册里选择图片上传也是很常见的功能了例如微信朋友圈等等.但是他们是自定义的选择器,可以选择多张图片并修改.这里我们讲一个最简单的:调用系统的相册选择一 ...

  9. Android拍照及从相册选择图片传详解(终极版)

    Android 拍照及从相册选择图片传详解 先上图 新知识点速览 URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符.通过使用位置,名称或两者来标识Internet上的 ...

最新文章

  1. OpenCV之imwrite()等基本操作
  2. 阿里120页PPT诠释国家“智能+”战略
  3. Sass Nesting for:悬停不起作用[重复]
  4. mysql delete语句_MySQL ------ 触发器(TRIGGER)(二十七)
  5. Binary Search
  6. C语言模拟实现标准库函数之qsort()
  7. java 将json转换成sql_SQL Server中将查询结果转换为Json格式脚本分享
  8. MySQL的position值是什么_MySQL数据库中系统函数POSITION功能简介
  9. redis应用之——获取若干最新注册用户
  10. Atitit 企业文化建设 职称体系建设 之道 attilax著 1. 职称 1 1.1. 职称级别 prc poc 设正高级、副高级、中级、助理级 1 2. Uke职称级别 资深 高级
  11. leetcode:骑士在棋盘上的概率
  12. Arduino应用开发——TCP/IP无线传输
  13. python怎么编辑浏览器_怎样修改anaconda默认浏览器
  14. 【Lintcode】1132. Valid Triangle Number
  15. http 503 service
  16. tesseract安装及配置
  17. 计算机科学丛书数据库系统,计算机科学丛书:数据库系统概念 读书笔记(十四)--事务(示例代码)...
  18. delta和gamma中性_套期保值中性技术操作之构建delta—gamma中性
  19. 脑电数据处理分析——edf转mat及fft
  20. 自如2020新产品发布:全面打造智能租住生活

热门文章

  1. 有关计算机的英语名言,有关生命力励志英文名言
  2. 如何选择电路中的电容
  3. 串口调试助手如何使用
  4. Fcitx──小企鹅输入法3.0.1版
  5. matlab输出指定尺寸图形,条形图,字体
  6. Linux: sysstat;pidstat
  7. redis五种数据类型及使用场景
  8. 踩坑 from utils import 报错
  9. PAT L1-016 查验身份证
  10. BOOTMGR is missing错误提示解决方法