14.3.1 调用系统的拍照功能

http://book.51cto.com  2010-06-22 14:19  李宁  中国水利水电出版社  我要评论(0)
  • 摘要:《Android/OPhone开发完全讲义》第8章Android服务,本章主要介绍了Android系统中的服务(Service)技术。Service是Android中4个应用程序组件之一。在Android系统内部提供了很多的系统服务,通过这些系统服务,可以实现更为复杂的功能,例如,监听来电、重力感应等。本节为大家介绍调用系统的拍照功能。
  • 标签:Android  OPhone  Android OPhone开发完全讲义
  • 限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
14.3.1  调用系统的拍照功能
本节的例子代码所在的工程目录是src\ch14\ch14_systemcamera
读者可以先试试自己手机上的拍照功能。可能由于手机型号不同,拍照的方式和过程也可能不一样。在HTC Hero手机上进行拍照会由系统自动对焦,在对焦的过程中,屏幕上会出现一个白色的对焦符号(类似于中括号)。如果对焦成功,这个对焦符号就会变成绿色,如图14.8所示。
当对焦成功后,按手机下方的【呼吸灯】按钮进行拍照。在拍照后手机屏幕下方会出现两个按钮:【完成】和【拍照】按钮。如果对照片满意,单击【完成】按钮结束拍照。如果对照片不满意,单击【拍照】按钮继续拍照,上一次拍的照片将丢失。由于这两个按钮无法通过DDMS透视图截获,因此,只能截获所拍的照片,如图14.9所示。当完成拍照后,可以对照片做进一步处理,例如本节的例子将照片显示在ImageView中,如图14.10所示。
图14.8  对焦成功(HTC Hero)
图14.9  拍照成功(HTC Hero)
图14.10  在ImageVie中
显示照片(HTC Hero)

从上面的拍照过程可以猜到,用于显示拍照过程影像的界面实际上也是一个Activity。因此要调用系统的拍照功能,就要用到7.1.2节介绍的调用其他应用程序的Activity的方式。与拍照功能对应的Action是android.provider.MediaStore.ACTION_IMAGE_CAPTURE。用于拍照的Activity需要返回照片图像数据,因此,需要使用startActivityForResult方法启动这个Activity,代码如下:

  1. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  2. startActivityForResult(intent, 1);
截获Activity返回的图像数据的事件方法是onActivityResult,代码如下:
  1. protected void onActivityResult(int requestCode, int resultCode, Intent data)
  2. {
  3. if (requestCode == 1)
  4. {
  5. if (resultCode == Activity.RESULT_OK)
  6. {
  7. //  拍照Activity保存图像数据的key是data,返回的数据类型是Bitmap对象
  8. Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data");
  9. //  在ImageView组件中显示拍摄的照片
  10. p_w_picpathView.setImageBitmap(cameraBitmap);
  11. }
  12. }
  13. super.onActivityResult(requestCode, resultCode, data);
  14. }
在默认情况下,系统的拍照Activity将照片保存在SD卡的DCIM\100MEDIA目录中(不同型号的手机可能保存的目录不同)。在拍照的过程中按手机下方的【menu】按钮会在屏幕的下方显示几个选项菜单。单击【分辨率】菜单项,会弹出一个只有一个分辨率选项的对话框(在HTC Hero手机上的分别率是624×416,如图14.11所示。这个分辨率可能随着手机型号的不同而不同,但分辨率都很小)。这就意味着所拍摄的照片分辨率不能大于624*416。如果将照片保存成大于这个分辨率,照片就会失真。而手机自带的拍照程序可以根据手机摄像头的最大分辨率设置多个照片分辨率,如图14.12所示。
图14.11  拍照Activity时可设置的
图14.12  拍照程序可设置的
照片分辨率(HTC Hero) 照片分辨率(HTC Hero)
根据官方文档的解释,在调用拍照Activity时通过MediaStore.EXTRA_OUTPUT指定照片保存的路径,可以允许拍摄分辨率更大的照片。原文如下:
The caller may pass an extra EXTRA_OUTPUT to control where this p_w_picpath will be written. If the EXTRA_OUTPUT is not present, then a small sized p_w_picpath is returned as a Bitmap object in the extra field. This is useful for applications that only need a small p_w_picpath. If the EXTRA_OUTPUT is present, then the full-sized p_w_picpath will be written to the Uri value of EXTRA_OUTPUT.
按着官方的解释,可以使用如下代码调用拍照Activity:
  1. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  2. intent.putExtra(MediaStore.EXTRA_OUTPUT, 
    Uri.fromFile(new File("/sdcard/test.jpg")));
  3. startActivityForResult(intent, 1);
但经作者测试,在调用拍照Activity时设置EXTRA_OUTPUT并不起任何作用(仅对Android SDK 1.5)。这也许是Android SDK 1.5的一个bug,或官方文档描述有误。如果读者非要拍摄更大分辨率的照片,可以实现自己的拍照Activity来完成这个功能,这部分内容将在14.3.2节介绍。
虽然使用系统的拍照Activity无法拍摄更大分辨率的照片,但可以同时生成分辨率更小的照片。通过insertImage方法可以同时在/sdcard/DCIM/.thumbnails和/sdcard/DCIM/Camera目录中分别生成分辨率为50×50和208×312的图像(其他型号的手机也有可能是其他的分辨率)。调用insertImage方法的代码如下:
  1. MediaStore.Images.Media.insertImage
    (getContentResolver(), cameraBitmap, null, null);
其中cameraBitmap是拍照Activity返回的Bitmap对象。
不仅可以调用系统的拍照Activity,而且可以调用系统的摄像Activity。摄像Activity对应的Action是MediaStore.ACTION_VIDEO_CAPTURE,调用方法与调用系统的拍照Activity相同。
【责任编辑:云霞 TEL:(010)68476606】

职场 功能 系统

0

分享

微博 QQ 微信

收藏

上一篇:11.2.1 Vsftpd软件包... 下一篇:网站拒绝备案域名9月30日将被关...
51bom

492篇文章,19W+人气,0粉丝

转载于:https://blog.51cto.com/2189440bop58/400121

14.3.1 调用系统的拍照功能相关推荐

  1. Android调用系统的拍照,打开相册功能

    Android调用系统的拍照,打开相册功能 1 添加权限: <!-- 往SDCard写入数据权限 --> <uses-permission android:name="an ...

  2. android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...

    版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是"确定"图标,返回的resultCode = -1(Activity.RESU ...

  3. 安卓调用系统相机拍照并返回,实现图片预览

    安卓调用相机拍照并返回预览及相关类型换(略缩图,画质糊)原图预览参考传送门 一.demo预览 二.xml代码和activity简单代码描述. 三.顺便写几个转换工具方法吧 今年主要在忙新项目,安卓也有 ...

  4. 解决三星调用系统相机拍照显示图片旋转90度横着的问题

    最近项目有个功能是调用系统相机拍照上传图片的功能,发现别的手机都没有ok,只有三星的显示图片很明显是旋转了90度,横着的.后来百度了解是三星对android相机单独做了优化(android碎片化,各种 ...

  5. Android客户端之“微服私访”App的系统学习(八)调用系统摄像头拍照并管理照片并使用Okhttp上传文件至后台

    纤云弄巧,飞星传恨,银汉迢迢暗度.金风玉露一相逢,便胜却.人间无数.柔情似水,佳期如梦,忍顾鹊桥归路.两情若是久长时,又岂在.朝朝暮暮.明天就是七夕了,在此吟诗一首,然而和我并木有什么关系,所以还是静 ...

  6. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  7. linux 短信功能,Android调用系统短信功能发送短信

    Android调用系统短信功能发送短信有两种方法: 第一种,设定发送的号码,和内容,界面没有联系人,群组组等按钮,如下图所示: 代码如下: Uri smsToUri = Uri.parse(" ...

  8. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓短信功能全解:调用系统短信功能发送短信.彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信. 首先需要 ...

  9. Android调用系统相机拍照并保存到指定位置

    Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto)void onclick() {Intent intent = new Intent(MediaSt ...

最新文章

  1. R语言将数据列中的多种日期格式统一变化为一种固定格式实战:使用lubridate包中的parse_date_time函数
  2. Activiti实战. 导读
  3. c++ scanf输入字符串_在C语言中,你真的搞清楚字符串了吗?
  4. php ajax 表格编辑,php ajax表格实时编辑 PHP Ajax实现表格实时编辑
  5. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
  6. filewriter判断是否关闭_各种仪表故障判断,看完你也可以成为仪表维修专家
  7. linux查看xml文件的配置,Hibernate配置文件hibernate.cfg.xml的详细解释
  8. Oracle实例之间的心跳机制,为何而心跳-Oracle Heartbeat研究之二
  9. ios 裁剪框大小_IOS UIimageView裁剪
  10. 4.1 选择IDC机房 4.2 硬件服务器选型 4.3 上架服务器 4.4/4.5 装系统
  11. 计算机信息安全工程师教材,第二级 系统审计保护级-信息安全工程师教材
  12. 如何将Excel工作表另存为PDF
  13. easyrecovery软件如何恢复丢失数据-注册码-序列号-密钥最新绿色下载版
  14. crm客户管理软件的精髓
  15. MYSQL-DBA书籍推荐
  16. 大白菜U盘PE重装系统
  17. 与编程密切相关的数学——离散数学——代数系统篇
  18. ROSMoveit中机械臂的点动(Jog)实现
  19. 文献阅读---玉米干旱响应和耐受性基因表达的调控变异定位
  20. 微信辅助验证 信息填写正确 却提示绑卡信息错误的解决办法

热门文章

  1. java 静态 编译_Java中的动态和静态编译实例详解
  2. 【 FPGA 】FIR 滤波器之滤波器的系数数据(Filter Coefficient Data)
  3. 【 FPGA 】FIR 滤波器之半带抽取器(Half-band Decimator)
  4. 应用PlanAhead 进行布局规划
  5. 2019-06-07 Java学习日记之CSS
  6. jenkins需安装插件总结
  7. iOS开发-单例模式
  8. careercup-C和C++ 13.6
  9. 链表节点合并排序:数组和单链表
  10. 利用openssh实现chroot监牢