android多媒体和相机详解六
接收相机intent的结果
一旦你构建并执行了一个图像或视频相机intent,你的应用必须配置为能接收intent的结果.本节向你展示如何拦截从相机intent来的回调以使你的应用可以对获取到的图像和视频做更多的动作.
为了接收一个intent的结果,你必须覆写启动intent的activity的onActivityResult()方法.下面的代码演示了如何覆写onActivityResult()来取得相机intent的结果.
[java]
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
}
}
}
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更多的代码,但是它可以提供一个更吸引人的用户体验。
为你的应用创建一个定制的相机界面的一般步骤是:
探测并使用相机-创建代码来检测相机是否存在并请求使用它.
创建一个预览类-创建一个相机预览类,它从Su易做图ceView派生并实现Su易做图ceHolder接口。此类可以预览从相机来的实时影像。
构建一个预览Layout- 当你有了相机预览类后,再创建一个viewlayout包含预览类和用于控制的用户界面。
建立图像获取的易做图– 为你的控制界面建立响应用户动作的易做图。
获取并存入文件中– 建立获取视频或图像然后存储的代码。
释放相机-用完相机后,你的应用必须正确的释放它以供别的应用使用。
相机硬件是一个共享资源,必须小心管理,才能使你的应用不与别的也使用相机的应用产生冲突。后面的章节讨论如何检测相机,如何请求使用一个相机,如何获取图像或视频以及如何释放相机。
警告:记住在用完成时要调用Camera.release()来释放相机对象!如果你的应用没有正确地释放相机,所有的后续对相机的使用,包括你自己的应用所发出的,将会失败并导致你自己的应用或其它应用关闭。
检测相机硬件
如果你的应用不使用manifest声明请求相机,你就应该在运行时检测相机是否可用。要执行这种检测,需使用PackageManager.hasSystemFeature()方法,如下所示:
[java]
/** 检查设备是否具有相机*/
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;
}
}
/** 检查设备是否具有相机*/
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 ,