野人学Android第二弹——照片的拍摄与存储(一)
2015-11-21 20:52
549 查看
首先来说一下相机的调用,利用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参数的例子
在主程序调用相机程序的时候,我并没有添加EXTRA_OUTPUT这个参数到Intent中,按照文档的解释,应该会返回一个Bitmap值。那么我就查看onActivityResult的返回参数,发现只有data这个参数有可能承载了Bitmap。因为data这个参数的类型是Intent,自然而然地想到用getExtras()这个方法来获取Bundle值。但是我并没有查到文档中说明这个Bundle里面有哪些数据,所以我用了一个通用的Bundle遍历,将获取到的值强制转换成Bitmap,赋值给ImageView。最后,通过测试,发现通过这个方法能将拍摄到的照片显示在ImageView中,但是很遗憾,我没看到这个照片存储的地方。
2.有EXTRA_OUTPUT参数的例子
在主程序中,我创建了图片要存放的空文件,然后通过Uri的转换,赋值给EXTRA_OUTPUT,然后传递给相机程序。按照无EXTRA_OUTPUT的逻辑,我尝试去获取data的值,发现这是个null值,所以我只能通过主程序中创建的file值获取图片。在onActivityResult中,我写了两个方法显示图片,第一种是通过file的绝对路径赋值给ImageView,第二种是通过file的Uri赋值给ImageView,这两种方法均测试有效。
虽然上面的内容已经完成了基础的照片拍摄和存储,但代码的优化是没有止境的。我想在图片的存储上下点功夫。存储,有两种概念,一种是物理位置的存储;另一种是数据库信息的存储。前者在第二个例子中已经简单介绍了,但还是有不足之处;后者是为了图片的上传服务的,图片上传的功能在下一篇博文中会涉及到,在这里先铺垫下。
1.图片的物理位置的存储
2.图片信息的数据库存储
关于数据库的存储,我想了下还是另开一篇博客吧。因为我想详细地阐述下系统自带的数据库存储和自定义的存储,内容比较多。
最后:
这篇博文花了我十天的时间才算基本完成。在这十天里,发生了很多事情,让我一直没有时间来完成,索性现在也算是完成了。12月份,我会将所有的精力花在编程上面。要想将编程的技术更上一个台阶,就必须做全职的程序员。我已经做好从零开始的准备,加油!我反正一无所有,又怕什么失去呢?
写于2015年12月2日凌晨
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图片轮播
- 【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)
- Android和JS的简单交互
- Android的Service了解和两种启动方式
- Android中对Apk加固(加壳)续篇之---对Native层(so文件)进行加固
- 深入剖析Android四大组件(七)——Activity启动的4个阶段
- android轮询最佳实践service+AlarmManager+Thread
- Android Studio 安装
- 详解Android四种基本布局
- PC/SC在android上的移植
- Android中的Handler的用法和用Handler进行更新版本
- Android 使用百度LBS SDK(六)轨迹回放
- Android逆向之旅---基于对so中的函数加密技术实现so加固
- android手机震动代码
- Android对不同DPI的dimen选择优先级问题
- 《第一行代码--Android》读书笔记之使用通知和多媒体
- Android数据存储——SharedPreferences、File、Sqlite
- android压缩图片Demo
- Android开发规范之编码规范
- Android dumpsys 命令解析