一旦你构建并执行了一个图像或视频相机intent,你的应用必须配置为能接收intent的结果.本节向你展示如何拦截从相机intent来的回调以使你的应用可以对获取到的图像和视频做更多的动作.
为了接收一个intent的结果,你必须覆写启动intent的activity的onActivityResult()方法.下面的代码演示了如何覆写onActivityResult()来取得相机intent的结果.
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { // Image captured and saved to fileUri specified in the Intent Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show(); } else if (resultCode == RESULT_CANCELED) { // User cancelled the image capture } else { // Image capture failed, advise user } } if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { // Video captured and saved to fileUri specified in the Intent Toast.makeText(this, "Video saved to:\n" + data.getData(), Toast.LENGTH_LONG).show(); } else if (resultCode == RESULT_CANCELED) { // User cancelled the video capture } else { // Video capture failed, advise user } } }
一旦你的activity接收到一个成功的结果,获取到的图像或视频就在某个路径下等着你去处理它们了.
一些开发者可能需要一个相机用户接口用来定制他们的应用的外观或提供特一些特殊的特性。创建一个定制的相机activity需要比使用intent更多的代码,但是它可以提供一个更吸引人的用户体验。
为你的应用创建一个定制的相机界面的一般步骤是:
探测并使用相机-创建代码来检测相机是否存在并请求使用它.
创建一个预览类-创建一个相机预览类,它从SurfaceView派生并实现SurfaceHolder接口。此类可以预览从相机来的实时影像。
构建一个预览Layout- 当你有了相机预览类后,再创建一个viewlayout包含预览类和用于控制的用户界面。
建立图像获取的监听器– 为你的控制界面建立响应用户动作的监听器。
获取并存入文件中– 建立获取视频或图像然后存储的代码。
释放相机-用完相机后,你的应用必须正确的释放它以供别的应用使用。
相机硬件是一个共享资源,必须小心管理,才能使你的应用不与别的也使用相机的应用产生冲突。后面的章节讨论如何检测相机,如何请求使用一个相机,如何获取图像或视频以及如何释放相机。
警告:记住在用完成时要调用Camera.release()来释放相机对象!如果你的应用没有正确地释放相机,所有的后续对相机的使用,包括你自己的应用所发出的,将会失败并导致你自己的应用或其它应用关闭。
如果你的应用不使用manifest声明请求相机,你就应该在运行时检测相机是否可用。要执行这种检测,需使用PackageManager.hasSystemFeature()方法,如下所示:
/** 检查设备是否具有相机*/ Devate boolean checkCameraHardware(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ // this device has a camera return true; } else { // no camera on this device return false; } }
Android设备可能具有多个相机,比如一个正面有一个视频聊天相机,后面有一个拍照相机。Android2.3(API Level 9) 及后续版本允许你检查相机的数量,使用Camera.getNumberOfCameras()方法。
如果你确定你应用所在的设备上有一个相机,你必须获得相机的一个实例后才能请求使用它(除非你正在使用intent来使用相机)。
要使用主相机,使用Camera.open()方法并注意去捕获任何异常,就像下面代码所示:
/** 一个获取相机对象实例的安全方法 */ public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); // attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable }
警告:在使用Camera.open()时总是要检查异常。否则如果相机正被使用或不存在将导致你的应用被系统关闭。
在运行Android2.3 (API Level 9)或更高版本的设备上,你可以使用Camera.open(int)访问特定的相机。上面的例子代码将访问第一个相机,也就是反面的相机。
一旦你获取到一个相机,你就可以使用Camera.getParameters()方法获取有关相机能力的信息,主要是检查所返回的Camera.Parameters对象以确定相机的能力。当使用APILevel 9或更高版本,使用Camera.getCameraInfo()来确定相机是位于正面还是反面,以及它的图像是横的还是竖的。