Android 调用相机APP获取拍照图片和从相册选择图片
源码部分分析
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获取拍照图片和从相册选择图片相关推荐
- MUI 拍照和从系统相册选择图片上传
要完成用MUI 拍照和从系统相册选择图片上传的功能,可以理解成有三个功能 1 调用手机相机的功能(可以查看官方API http://www.html5plus.org/doc/zh_cn/camer ...
- android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...
这里主要是基于Android 7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径. 首先需要在AndroidManifest.xml声明调用相机的权 ...
- android调用相机后自动拍照
b 合理使用requestAnimationFrame动画代替setTimeout 微服务 基于Mongodb分布式集做数据分析时,当前命令 IBM DB2 .比如路由器即不能有这种情况出现,赢得了各 ...
- 关于小米手机从系统相册选择图片的一个bug
在开发应用的时候碰到一个问题,拍照或者从系统相册选择图片并上传,首先从相机或者相册获取图片并压缩处理,最后再上传,代码写好并基本测试通过,然而深度测试的时候却发现有一个问题. 在小米手机,即MIUI系 ...
- android 调用相机拍照。适配到 Android 10
Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者 提 Bug 标签: android ...
- android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...
Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...
- Android10(华为Mate30)获取图片路径失败,拍照或从相册选择图片后无法显示
在使用华为Mate30是从图库选择图片,本地无法显示,其他手机没问题,发现是兼容Android10的问题,Android10下本app的私有文件是不需要权限的,访问其他应用权限需要权限 android ...
- 学习笔记之Android调用系统相册选择图片
文章目录 前言 使用步骤 小结 参考资料 前言 在相册里选择图片上传也是很常见的功能了例如微信朋友圈等等.但是他们是自定义的选择器,可以选择多张图片并修改.这里我们讲一个最简单的:调用系统的相册选择一 ...
- Android拍照及从相册选择图片传详解(终极版)
Android 拍照及从相册选择图片传详解 先上图 新知识点速览 URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符.通过使用位置,名称或两者来标识Internet上的 ...
最新文章
- OpenCV之imwrite()等基本操作
- 阿里120页PPT诠释国家“智能+”战略
- Sass Nesting for:悬停不起作用[重复]
- mysql delete语句_MySQL ------ 触发器(TRIGGER)(二十七)
- Binary Search
- C语言模拟实现标准库函数之qsort()
- java 将json转换成sql_SQL Server中将查询结果转换为Json格式脚本分享
- MySQL的position值是什么_MySQL数据库中系统函数POSITION功能简介
- redis应用之——获取若干最新注册用户
- Atitit 企业文化建设 职称体系建设 之道 attilax著 1. 职称	1 1.1. 职称级别 prc poc 设正高级、副高级、中级、助理级	1 2. Uke职称级别 资深 高级
- leetcode:骑士在棋盘上的概率
- Arduino应用开发——TCP/IP无线传输
- python怎么编辑浏览器_怎样修改anaconda默认浏览器
- 【Lintcode】1132. Valid Triangle Number
- http 503 service
- tesseract安装及配置
- 计算机科学丛书数据库系统,计算机科学丛书:数据库系统概念 读书笔记(十四)--事务(示例代码)...
- delta和gamma中性_套期保值中性技术操作之构建delta—gamma中性
- 脑电数据处理分析——edf转mat及fft
- 自如2020新产品发布:全面打造智能租住生活