MyException - 我的异常网
当前位置:我的异常网» 移动开发 » 调用系统的照相功能

调用系统的照相功能

www.MyException.Cn  网友分享于:2013-07-26  浏览:53次
调用系统的拍照功能

《Android/OPhone开发完全讲义》第8章Android服务,本章主要介绍了Android系统中的服务(Service)技术。Service是Android中4个应用程序组件之一。在Android系统内部提供了很多的系统服务,通过这些系统服务,可以实现更为复杂的功能,例如,监听来电、重力感应等。本节为大家介绍调用系统的拍照功能。

AD: <script src="http://www.51cto.com/js/article/keywords_ad_new.js"></script>

 

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.         imageView.setImageBitmap(cameraBitmap);  
  11.     }  
  12.     }  
  13.     super.onActivityResult(requestCode, resultCode, data);  

在默认情况下,系统的拍照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 image will be written. If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap object in the extra field. This is useful for applications that only need a small image. If the EXTRA_OUTPUT is present, then the full-sized image 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相同。

文章评论

每天工作4小时的程序员
每天工作4小时的程序员
一个程序员的时间管理
一个程序员的时间管理
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
代码女神横空出世
代码女神横空出世
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
编程语言是女人
编程语言是女人
程序员和编码员之间的区别
程序员和编码员之间的区别
旅行,写作,编程
旅行,写作,编程
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
总结2014中国互联网十大段子
总结2014中国互联网十大段子
我是如何打败拖延症的
我是如何打败拖延症的
漫画:程序员的工作
漫画:程序员的工作
我的丈夫是个程序员
我的丈夫是个程序员
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
鲜为人知的编程真相
鲜为人知的编程真相
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老程序员的下场
老程序员的下场
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
 程序员的样子
程序员的样子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
中美印日四国程序员比较
中美印日四国程序员比较
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员必看的十大电影
程序员必看的十大电影
程序员的鄙视链
程序员的鄙视链
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
10个调试和排错的小建议
10个调试和排错的小建议
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员都该阅读的书
程序员都该阅读的书
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有