野人学Android第二弹——照片的拍摄与存储(一)

原创 2015年11月21日 20:52:55

首先来说一下相机的调用,利用Intent调用MediaStore.ACTION_IMAGE_CAPTURE来实现。代码如下:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

天生好奇的你,是不是会问,“MediaStore.ACTION_IMAGE_CAPTURE”是什么呢?来看下源码。


android.media.action.IMAGE_CAPTURE的解释是,传送到相机应用的标准Intent的action,用来获取一张照片并且会返回照片。在传递的过程中,也可以添加一个另外的EXTRA_OUTPUT来控制照片存储的位置。如果EXTRA_OUTPUT这个参数不存在,那么就会以Bitmap的类型返回一个小尺寸的图片,保存在外部文件夹中。这个对于那些只需要小图片的应用是有用的。如果EXTRA_OUTPUT存在,那么就会存储全尺寸的图片到EXTRA_OUTPUT映射的Uri指定的路径中。这些文字看起来比较生硬,来点实际的代码提提神!

1.无EXTRA_OUTPUT参数的例子

private int REQUEST_CODE_PHOTO =1;
	private ImageView img;
	private Button bt;
	private File file;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_pic);
		img =  (ImageView) findViewById(R.id.imageView1);
		bt = (Button) findViewById(R.id.button1);
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				startActivityForResult(intent, REQUEST_CODE_PHOTO);
			}
		});
		
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		  if(requestCode == REQUEST_CODE_PHOTO){
	        	if(resultCode == RESULT_OK){
	        		Bundle bundle = data.getExtras();
	        		Set<String> keySet = bundle.keySet();
	        		for (String key : keySet) {
	        			img.setImageBitmap((Bitmap) bundle.get(key));
				}
	        	}
	        }
	} 

在主程序调用相机程序的时候,我并没有添加EXTRA_OUTPUT这个参数到Intent中,按照文档的解释,应该会返回一个Bitmap值。那么我就查看onActivityResult的返回参数,发现只有data这个参数有可能承载了Bitmap。因为data这个参数的类型是Intent,自然而然地想到用getExtras()这个方法来获取Bundle值。但是我并没有查到文档中说明这个Bundle里面有哪些数据,所以我用了一个通用的Bundle遍历,将获取到的值强制转换成Bitmap,赋值给ImageView。最后,通过测试,发现通过这个方法能将拍摄到的照片显示在ImageView中,但是很遗憾,我没看到这个照片存储的地方。

2.有EXTRA_OUTPUT参数的例子

        private int REQUEST_CODE_PHOTO =1;
	private ImageView img;
	private Button bt;
	private File file;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_pic);
		img =  (ImageView) findViewById(R.id.imageView1);
		bt = (Button) findViewById(R.id.button1);
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				file = new File(Environment.getExternalStorageDirectory(),"test.jpg");//创建空文件
				try {
					file.createNewFile();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));//将file的uri赋值给EXTRA_OUTPUT这个参数
				startActivityForResult(intent, REQUEST_CODE_PHOTO);
			}
		});
		
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		  if(requestCode == REQUEST_CODE_PHOTO){
	        	if(resultCode == RESULT_OK){
	        		img.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));//通过file的绝对路径赋值给ImageView
				//img.setImageURI(Uri.fromFile(file));//通过file的uri赋值给ImageView
	        	}
	        }
	} 

在主程序中,我创建了图片要存放的空文件,然后通过Uri的转换,赋值给EXTRA_OUTPUT,然后传递给相机程序。按照无EXTRA_OUTPUT的逻辑,我尝试去获取data的值,发现这是个null值,所以我只能通过主程序中创建的file值获取图片。在onActivityResult中,我写了两个方法显示图片,第一种是通过file的绝对路径赋值给ImageView,第二种是通过file的Uri赋值给ImageView,这两种方法均测试有效。

虽然上面的内容已经完成了基础的照片拍摄和存储,但代码的优化是没有止境的。我想在图片的存储上下点功夫。存储,有两种概念,一种是物理位置的存储;另一种是数据库信息的存储。前者在第二个例子中已经简单介绍了,但还是有不足之处;后者是为了图片的上传服务的,图片上传的功能在下一篇博文中会涉及到,在这里先铺垫下。

1.图片的物理位置的存储

String dir = Environment.getExternalStorageDirectory()+"/DICM1";//新建文件夹的路径
File destDir = new File(dir);//实例化路径
if (!destDir.exists()) {
	destDir.mkdirs();//如果没有创建,那么就创建文件夹
}
<-----------------分界线-------------------------->
file = new File(destDir,"DDD.jpg");//设置一个文件名,然后放置到指定的文件夹中
				
try {
	file.createNewFile();
} catch (IOException e) {
        e.printStackTrace();
}
首先要创建一个文件夹,然后再创建空文件。其他的逻辑代码和上面一样,这里就不赘述了。


2.图片信息的数据库存储

关于数据库的存储,我想了下还是另开一篇博客吧。因为我想详细地阐述下系统自带的数据库存储和自定义的存储,内容比较多。





最后:

这篇博文花了我十天的时间才算基本完成。在这十天里,发生了很多事情,让我一直没有时间来完成,索性现在也算是完成了。12月份,我会将所有的精力花在编程上面。要想将编程的技术更上一个台阶,就必须做全职的程序员。我已经做好从零开始的准备,加油!我反正一无所有,又怕什么失去呢?

写于2015年12月2日凌晨

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 调用系统摄像头拍照保存并且更新到图库

首先要添加权限
  • wu996489865
  • wu996489865
  • 2016年01月12日 11:27
  • 2761

android开发(15) 调用摄像头拍照,保存在照片到数据库。

好吧。我们做手机开发的,总是避免不了操作摄像头的问题。我在这里也纠结了一天。只好不停的再搜索引擎里搜来搜去。最后做了一个完整示例。期间遇到很多问题,把自己折磨的不行。那么弄个完整的示例,给自己,也给后...
  • vir56k
  • vir56k
  • 2015年08月14日 14:49
  • 1844

android调用系统相机拍照并保存在本地

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j...
  • abc5382334
  • abc5382334
  • 2014年05月05日 23:30
  • 38597

野人学Android第二弹——Handler与Thread之间的关系

在Android的世界里,提到Handler,那么势必要提到Thread。Thread是什么呢?很简单,就是“线程”的意思,通俗点讲,就是“一心二用”,在同一阶段进行多个任务。任务与任务之间是相对独立...
  • qingxinyeren
  • qingxinyeren
  • 2015年11月15日 17:15
  • 183

野人学Android第二弹——利用Zxing实现二维码效果的步骤讲解

如今,不管是微信还是淘宝,越来越多的app会加入二维码扫描的功能,那么二维码的生成和解析怎么实现呢?我首先想到的是,这么流行的功能,一定有第三方类,果不其然,在百度之后,发现google已经将二维码的...
  • qingxinyeren
  • qingxinyeren
  • 2015年11月18日 16:00
  • 275

野人学Android第二弹——单张图片的上传

上一篇博文中,我简单讲解了图片上传的基本原理,可能你还有点不懂,那么在本篇博文中,我会以具体的代码来阐述下Android是如何将图片上传到服务器的。 有两个难点需要解决: 1、Android端的HTT...
  • qingxinyeren
  • qingxinyeren
  • 2015年12月05日 21:15
  • 584

野人学Android第二弹——AutoCompleteTextView自动搜索数据库

AutoCompleteTextView的作用不言而喻,可以减少输入量,提高效率。比如说,你想在TextView中输入五个字,而用了AutoCompleteTextView这个控件后,只需要输入两个字...
  • qingxinyeren
  • qingxinyeren
  • 2015年12月12日 21:46
  • 595

野人学Android第二弹——自定义ListView第一课

在APP界,不管是微信还是微博,都会使用到ListView这一基本的控件,所以学好ListView有多么重要。所谓“工欲善其事必先利其器”,要想开发更加优质的APP,那么就需要花点精力研究下ListV...
  • qingxinyeren
  • qingxinyeren
  • 2015年11月08日 10:35
  • 211

野人学Android第二弹——自定义ListView第二课

在上一篇博文中,我提供了一种自定义ListView的思路,如果你成功了,那么恭喜你。在兴奋之余,不知道你有没有觉得哪里不对劲。如果一个app中多次使用不同的ListView,那么意味着要写N个Adap...
  • qingxinyeren
  • qingxinyeren
  • 2015年11月08日 16:15
  • 208

野人学Android第三弹——利用java的反射机制创建一个数据操作类

在android的教学视频中,知道“Bean”的存在,觉得挺有道理的,所以在Andorid的开发中,经常会运用到。但是在实际的开发中,数据结构经常会调整,而在调用bean的类中...
  • qingxinyeren
  • qingxinyeren
  • 2016年01月14日 23:52
  • 245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:野人学Android第二弹——照片的拍摄与存储(一)
举报原因:
原因补充:

(最多只允许输入30个字)