Android Camera解析(上) 调用系统相机拍摄照片
开发中我们常须要通过相机获取照片(拍照上传等)。一般通过调用系统提供的相机应用就可以满足需求;有一些复杂需求还须要我们自己定义相机相关属性,下篇我们会涉及到。
首先我们来研究怎样简单调用系统相机应用来获取照片
GitHub地址:CameraDemo
调用系统相机获取照片基本上涉及下面三个过程:
1.启动系统相机拍照
2.获取拍摄到的图片
3.图片处理
下面是详细编码过程
Camera Permission
我们要使用系统相机,首先须要在Manifest中声明
<Manifest>
<uses-features android:name="android.hardware.camera"
android:required="true"/>
...
</Manifest>
附注: <uses-features/> 用来请求使用某些硬件或软件资源
详细使用详见
Intent
启动相机的Intent构造 MediaSotre.ACTION_IMAGE_CAPTURE
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
我们须要获得相机拍摄的照片。所以startActivity(intent,requestCode);之后在onActivityResult()中接收返回的数据
startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);
获得图片
这里须要注意,直接调用相机返回的照片是缩略图,并非完整尺寸,要想获得完整尺寸还须要做进一步处理:
1,获得缩略图(Thumbnail)
onActivityResult()方法的返回的intent的extras中存储在相应data下。一张缩略图
public void onActivityResult(int requestCode,int resultCode,Intent data){
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap)extras.get("data") ;
mImageView.setImageBitmap(imageBitmap);
}
2。获得完整尺寸图片
很多时候,缩略图并不能满足我们的需求。我们须要完整尺寸的图片。为此我们还须要做些工作;
首先我们须要将拍到的照片存储为文件(提供文件名称和完整的文件路径),之后通过该文件Uri便可訪问完整尺寸的图片;
1).涉及到文件存储。因此我们须要在Manifest中声明读写Storage的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2).文件路径问题,我们须要通过getExternalFileDir()和getExternalStoragePublicDirectory()两个方法得到存储路径。二者的差别是:前者获得路径是private。仅仅能供本程序读取,后者是public,全部应用均可訪问该图片。
...
private static final String CAMERA_DIR = "/dcim/";
private static final String albumName ="CameraSample";
...
//获得文件路径,这里以public为例
private File getPhotoDir(){
File storDirPrivate = null;
File storDirPublic = null;
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
//private,仅仅有本应用可訪问
storDirPrivate = new File (
Environment.getExternalStorageDirectory()
+ CAMERA_DIR
+ albumName
);
//public 全部应用均可訪问
storDirPublic = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
albumName);
if (storDirPublic != null) {
if (! storDirPublic.mkdirs()) {
if (! storDirPublic.exists()){
Log.d("CameraSample", "failed to create directory");
return null;
}
}
}
}else {
Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE.");
}
return storDirPublic;//或者return storDirPrivate;
}
3).文件名称问题。假设我们将文件名称写死,明显会出现文件名称冲突,同一路径无法存储多个文件,因此我们一般通过“时间戳”的方式命名图片;下面是一个简单的经常使用创建文件名称演示样例:
...
private static final String JPEG_FILE_PREFIX = "IMG_";
private static final String JPEG_FILE_SUFFIX = ".jpg";
...
private File createFile() throws IOException {
File photoFile = null;
String fileName;
//通过时间戳差别文件名称
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
fileName = JPEG_FILE_PREFIX+timeStamp+"_";
photoFile = File.createTempFile(fileName,JPEG_FILE_SUFFIX,getPhotoDir());
return photoFile;
}
4).我们还须要将文件的Uri传递给intent。同前面简易调用相机不同。这里我们须要将获得图片后,图片存储的文件Uri传递给Intent
Intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
5).完整尺寸照片的解码
我们还须要将保存的图片解码一次,代码演示样例
private void setPic() {
//获得图像的尺寸
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(photoFile.getAbsolutePath(),bmOptions);
int photoW = bmOptions.outWidth;
int photoH =bmOptions.outHeight;
//计算缩放
int scaleFactor = 1;
if((targetW>0)||(targetH>0)){
scaleFactor = Math.min(photoW/targetW,photoH/targetH);
}
//将保存的文件解码
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath(), bmOptions);
mImageView.setImageBitmap(bitmap);
}
6).Tips:一般这么获得的照片一般无法在手机相冊中直接浏览,能够将其加入至相冊以便我们浏览。
//将图片文件加入至相冊(便于浏览)
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(photoFile);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
综合演示样例:

假设还有疑问,请參考:
完整代码GitHub地址:
參考资料:
Android Camera 官方资料
Android Camera解析(上) 调用系统相机拍摄照片的更多相关文章
- Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是“确定”图标,返回的resultCode = -1(Activity.RESULT_OK): 如果 ...
- Android调用系统相机功能
在常规应用开发过程中,我们经常会使用到手机的相机功能,通过调用系统相机方便快捷的帮助我们实现拍照功能,本篇我将带领大家实现一下,如何通过调用系统相机实现拍照. 第一种:调用系统相机拍照,通过返回的照片 ...
- android调用系统相机并获取图片
如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...
- Android调用系统相机、自己定义相机、处理大图片
Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...
- Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...
- Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题
最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...
- Android调用系统相机以及自定义相机
0.综述 自定义相机,此处展示简单的相机功能,官方文档中还有相应关于视频拍摄的内容,此处不提 1.添加权限 <!--相机权限,数据存储--> <uses-permission and ...
- Android 调用系统相机拍照保存以及调用系统相册的方法
系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new ...
- Android下载图片/调用系统相机拍照、显示并保存到本地
package com.example.testhttpget; import java.io.BufferedReader; import java.io.FileNotFoundException ...
随机推荐
- js 数组包含
function(arr,element){ return new RegExp('(^|,)'+element.toString()+'(,|$)').test(arr.toString()); }
- mysql 操作提示 1366 Incorrect string value
一.报错说明 数据库此字段的字符集与整理字符集是否与SQL语句传递数据的字符集相同:不相同则会引发MySQL1366错误. 二.产生原因 windows 安装MySql 的时候选择的是默认的编码,创建 ...
- 为什么用Mysql?
阅读目录 楔子 初识数据库 为什么要用数据库 认识数据库 初识mysql mysql概念 下载和安装 初识sql语句 楔子 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来h ...
- java三大版本解析
JAVA三大版本代表着JAVA技术的三个应用领域:JAVASE.JAVAME.JAVAEE. JAVA以前很长一段时间被称为JAVA2,所以现在很多人习惯称为J2SE.J2ME.J2EE,它们表示的含 ...
- 洛谷P2607 [ZJOI2008]骑士(树形dp)
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- Redis 四:存储类型之散列类型
1.散列类型表达方式简介: =========================================== 键 字段 值 =================================== ...
- tomcat 使用常见问题
tomcat 下目录的介绍: 参考地址: http://blog.csdn.net/u013132035/article/details/54949593 参考书籍:tomcat权威指南 (1) 非w ...
- 网络教程(12) TCP协议
IP协议的限制 IP协议需要 datalink帧来包装它 Ethernet或者PPP 一般都有1500byte字节或者大小的限制 可能会出现的问题 Packet loss – retransmit R ...
- 重置浏览器默认样式 normalize.css
1 /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========= ...
- 域名系统(DNS)
DNS (domain name server/system) 1.基本信息 网络中数据通信依赖ip地址 测试:手动将dns服务地址改为空值,通过ip和域名分别测试网络的联通性 FQDN 完全域名(完 ...