本文译自:http://developer.android.com/training/camera/photobasics.html
本节课解释如何使用既存的照相应用程序来拍摄照片。
假设你正在开发一个气象服务的应用程序,它要把设备上运行的你的客户端应用程序所拍摄的天空照片混合到一起,制作一个整体的气象图。整合这些图片支持你的应用程序的一小部分。你想要用最小的代价来拍照,而不是重新来编写一个照相机应用程序。幸运的是,大多数Android设备都至少安装了一个照相机应用程序。本课中,你会学到如何使用这个应用来给你拍摄照片。
申请照相权限
如果你的应用程序的基本功能是拍摄照片,那么就要在Google Play上限制它只能在有照相机的设备上显示。要告知你应用程序依赖一个照相机,就要在你的清单文件中放一个<uses-feature>标签:
<manifest ... >
<uses-feature android:name="android.hardware.camera" />
...
</manifest ... >
如果你的应用程序使用照相机,但这个功能不是必要的,那么就要给这个标签添加android:required=”false”属性。这样设置之后,Google Play允许你的应用程序下载安装到没有照相机的设备上。然后,通过调用hasSystemFeature(PackageManager.FEATURE_CAMERA)方法来判断设备上是否有可用的照相机,如果没有,你应该禁用照相机功能。
用照相机应用程序拍摄照片
Android把操作委托给其他应用程序的方法是借助一个描述你要做的事情的Intent对象。这个过程包括三个阶段:1.创建一个Intent对象;2.启动外部 Activity的一个调用;3.焦点返回你的Activity时处理图片数据的代码。
以下是一个引用Intent来拍照的函数。
privatevoiddispatchTakePictureIntent(intactionCode){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent,actionCode);
}
使用这段代码,你的应用程序就具备了获取其他照相机应用程序所拍摄的照片的能力。如果没有兼容的应用程序准备捕获这个Intent对象,那么你的应用程序就会崩溃。下面的代码会检查是否有处理你的Intent对象的应用程序:
publicstaticbooleanisIntentAvailable(Context context,String action){
final PackageManagerpackageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}