文档章节

android相机拍照

 风过后
发布于 2016/04/12 13:37
字数 850
阅读 100
收藏 5
点赞 1
评论 0

1、系统权限

<uses-permission android:name="android.permission.CAMERA"></uses-permission>

 <uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />

第一种方法:

startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == TAKE_PICTURE) {
            if (resultCode == RESULT_OK) {
                Bitmap bm = (Bitmap) data.getExtras().get("data");
                img.setImageBitmap(bm);//想图像显示在ImageView视图上,
            }
         }
}

但是这种得到的图片是缩略图,清晰度不够,本人没有找到获得原始大图方法。

本人使用的是第二种方法:基本思想是在点击拍照时就建立起文件,当拍照完成后将bitmp填充进入

try {
						Intent takePictureIntent = new Intent(
								MediaStore.ACTION_IMAGE_CAPTURE);
						if (takePictureIntent
								.resolveActivity(getPackageManager()) != null) {

							File photoFile = null;
							try {
								photoFile = createImageFile();
								picPath = photoFile.getAbsolutePath();
							} catch (IOException ex) {
								ex.printStackTrace();
							}
							if (photoFile != null) {
								takePictureIntent.putExtra(
										MediaStore.EXTRA_OUTPUT,
										Uri.fromFile(photoFile));
								startActivityForResult(takePictureIntent,
										RESULT_take_pic);
							}
						}
					} catch (Exception e) {

					}
					
public File createImageFile() throws IOException {

		String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
				.format(new Date());
		String imageFileName = "JPEG_" + timeStamp + "_";
		File storageDir = new File(DirectoryUtil.getPicDirectory());

		if (!storageDir.isDirectory())
			storageDir.mkdirs();
		File image = File.createTempFile(imageFileName, /* prefix */
				".jpg", /* suffix */
				storageDir /* directory */
		);

		return image;
	}

拍照成功后返回执行函数:

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK && requestCode == REQ_VIEW_IMAGE) {
			Log.e("zhy", requestCode + "");
			mGrideAdapter.notifyDataSetChanged();

		} else if (requestCode == RESULT_take_pic) {
			if(picPath ==null){
				showLongToast("拍照失败请选择图片上传");
			}else{
				File file = new File(picPath);
				Long size = file.length();
				if (size <= 0) { //拍照失败删除文件
					if (file.exists()) {
						file.delete();
					}
				} else { //拍照成功显示图片
					NativeImageLoader.mSelectList.add(picPath);
					mGrideAdapter.notifyDataSetChanged();
				}
			}
		}

		super.onActivityResult(requestCode, resultCode, data);
	}

上述方法可以获得清晰的图片。

问题研究及解决:

用上述第二种方法的时候本人发现在三星部分手机(如note3)上拍照后activity会重启,如果不做任何处理重启后所有当前状态没有返回picPath=null则会导致死机。

在想到是activity重启导致状态丢失,本人首先想到在销毁前保存当前的现场状态,重启时回复现场。即做如下处理:

/**
	 * activity进入后台变得可能被销毁是调用
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putString("picPath", picPath); //保存当前拍照图片的地址
		List<String> lt = NativeImageLoader.mSelectList;
		outState.putString("mlistPath", ListToString(lt)); //保存已选择的所有图片地址可能多张
		super.onSaveInstanceState(outState);
	}
	private String ListToString(List<String> list){
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i<list.size(); i++){
			String s = list.get(i);
			sb.append(s);
			sb.append(",");
		}
		return sb.toString();
	}
	
	/**
	 * 当actvity从非正常销毁进入时调用
	 */
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		addingPic(); //恢复界面控件的状态
		String listStr = savedInstanceState.getString("mlistPath");
		if(listStr != null && !"".equals(listStr)){
			String[] strs = listStr.split(",");
			NativeImageLoader.mSelectList.addAll(Arrays.asList(strs));
		}
		
		picPath = savedInstanceState.getString("picPath"); //获得当前拍照图片的地址
		
	}

上述方法可以解决此问题,但是本人还有一个地方不明白

outState.putStringArrayList(); //api中给出此方法可以保存数组但是实际上得不到保存的数据
于是本人将数组转换为string中间用,分割,如下:
outState.putString("mlistPath", ListToString(lt)); //保存已选择的所有图片地址可能多张

问题虽然解决了但是为什么会出现这样的问题呢?后来我仔细查看了那个手机的拍照过程,中间好像是activity发生旋转。后来我在mainfest中配置了android:configChanges="keyboardHidden|orientation|screenSize"此属性。发现此问题解决了activity并没有销毁,如此证明我的猜想是正确的。注意keyboardHidden|orientation|screenSize一定要配置这三个属性,一开始本人只配置两个,导致后来才想到了保持状态的方法。此上两种方法均可以解决此问题,明显第二种要简单很多!


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 17
码字总数 16917
作品 0
成都
项目需求讨论 - WebView下拍照及图片选择功能

前言: 如果觉得掘金上看图片放大看不清楚,可以跳到另外的同步发布的链接看,放大图片下部有个可以查看原图功能,很清楚:项目需求讨论 - WebView下拍照及图片选择功能 现在很多app里面,都...

青蛙要fly
06/23
0
0
Android 使用摄像头拍照

1、布局main.xml android:id="@+id/mySurfaceView"android:gravity="center_horizontal" android:id="@+id/btnOpen"android:textSize="18px"...

veidy
2013/05/25
0
0
Android 调用系统拍照 笔记

由于临时需要做个简单的Android程序,其中涉及调用系统拍照并保存照片。之前没有任何Java和Android经验,coding中遇到不少问题,特记录以供参考。 Google一下能找到不少现成的调用系统拍照的...

会说话的哑巴
2012/09/07
0
0
关于调用Android照相功能获取图片

最近在项目中调用相机,使用了别人写好的文件,但发现获取的照片没真正使用系统照相拍照再查看那么清晰,于是研究了一下,发现通常调用照相功能获取的图片都是被压缩的,如果要获取原照,那得...

tyronejw
2015/08/18
0
0
android应用中涉及拍照等耗内存操作需要注意的地方

android应用中可能会需要一张图片,这个时候会有多个选项,比如从本地获取、拍照,有些甚至是从服务端请求图片数据。在内存不足的情况下,极容易导致activity被杀,然后又因为是系统杀死的,...

OliverC
2014/01/21
0
0
View not attached to window manager

今天在写程序中遇到如下问题,如此怪异,在网上找了很多,终于解决了问题: java.lang.IllegalArgumentException: View not attached to window manager 解决方法: 在调用系统相机拍照相片后...

刘遇安
2013/08/29
0
0
Android Camera架构浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

sflfqx
2014/10/31
0
0
Android 新老两代 Camera API 大起底

0.背景简介 最近有一部分相机相关的需求,专注于对拍摄的照片、视频的噪点、色温、明暗等方面进行优化。一般我们在生活中使用相机来拍照的话,在前期拍摄时,就可以通过调整相机的拍摄参数,...

byeweiyang
05/30
0
0
你需要知道的Android拍照适配方案

你需要知道的Android拍照适配方案 字数4229 阅读4284 评论23 喜欢71 声明:本文作者授权微信公众号Android程序员(AndroidTrending)在微信公众号平台原创首发。 近段时间,家里陪自己度过大...

3kqing
2016/06/05
31
0
Android应用程序基础(Application Fundamentals)之一

正在尝试分析SDK中的示例程序NotePad,发现仍然还欠缺很多知识。今天看到 API Guides 下有一部分应用程序基础 Application Fundamentals,感觉需要进一步学习。于是准备采用之前的策略,边翻...

AllenYao
2013/01/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现服务启动之后,马上执行任务的几种方法

有哪些方法 实现服务启动之后,马上执行相关操作? 方式一 :@PostConstruct 对类的要求 无,普通的java bean即可 例如: /*** * 执行完构造方法之后就会执行该方法 */@PostConstruc...

黄威
13分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
56分钟前
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
57分钟前
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部