android camera介绍
android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Camera程序。由于自写Camera需要对Camera API了解很充分,而且对于通用的拍照和摄像应用只需要借助系统Camera App程序就能满足要求了。
在AndroidMainfest.xml中声明使用照相机.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
调用系统相机进行拍照或拍摄
构造一个Camera Intent -- 创建一个拍摄照片或者视频的Intent, 我们可以使用如下两种方法:
MediaStore.ACTION_IMAGE_CAPTURE -- 一个intent action,用来向系统Camera程序请求拍摄图片。
MediaStore.ACTION_VIDEO_CAPTURE -- 一个intent action, 用来向系统Camera程序请求录制视频。
MediaStore.EXTRA_OUTPUT -- 指定一个Uri对象,系统Camera程序会把拍摄的图片存储到指定位置。
MediaStore.EXTRA_VIDEO_QUALITY -- 视频质量,0(低质量,比较小的文件来存储视频), 1(高质量,比较大的文件来存储视频)
MediaStore.EXTRA_DURATION_LIMIT -- 设置一个值来限制视频时间长度,秒为单位。
MediaStore.EXTRA_SIZE_LIMIT -- 设置一个值来限制视频大小,byte为单位。
MediaStore.ACTION_IMAGE_CAPTURE -- 一个intent action,用来向系统Camera程序请求拍摄图片。
MediaStore.ACTION_VIDEO_CAPTURE -- 一个intent action, 用来向系统Camera程序请求录制视频。
MediaStore.EXTRA_OUTPUT -- 指定一个Uri对象,系统Camera程序会把拍摄的图片存储到指定位置。
MediaStore.EXTRA_VIDEO_QUALITY -- 视频质量,0(低质量,比较小的文件来存储视频), 1(高质量,比较大的文件来存储视频)
MediaStore.EXTRA_DURATION_LIMIT -- 设置一个值来限制视频时间长度,秒为单位。
MediaStore.EXTRA_SIZE_LIMIT -- 设置一个值来限制视频大小,byte为单位。
拍照示例代码:
<pre name="code" class="java">// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, 1);
自定义预览流程
private void initSurfaceView() {
this.mSurfaceview = ((SurfaceView) findViewById(R.id.surface_camera));
this.mSurfaceHolder = this.mSurfaceview.getHolder();
this.mSurfaceHolder.setFormat(-3);
this.mSurfaceHolder.setType(3);
this.mSurfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
this.mCamera = Camera.open();
try {
this.mCamera.setPreviewDisplay(this.mSurfaceHolder);
this.mCamera.setPreviewCallback(this.mPreviewCallback);
} catch (Exception localException) {
while (true) {
if (this.mCamera != null) {
this.mCamera.release();
this.mCamera = null;
}
}
}
}
private void initCamera() {
Camera.Parameters localParameters = this.mCamera.getParameters();
localParameters.setPictureFormat(256);
localParameters.setPreviewFormat(17);
localParameters.setPreviewSize(mPreviewWidth,mPreviewHeight);
localParameters.setPictureSize(mPreviewWidth, mPreviewHeight);
localParameters.setPreviewFrameRate(15);
this.mCamera.setParameters(localParameters);
this.mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (this.mCamera != null) {
this.mCamera.setPreviewCallback(null);
this.mCamera.stopPreview();
this.bIfPreview = false;
this.mCamera.release();
this.mCamera = null;
}
}
// 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度
public static int getPreviewDegree(Activity activity) {
// 获得手机的方向
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
// 根据手机的方向计算相机预览画面应该选择的角度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
获取预览画面数据
mCamera.setPreviewCallback(this.mPreviewCallback);
private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {
public void onPreviewFrame(byte[] paramAnonymousArrayOfByte,
Camera paramAnonymousCamera) {
if (mEncoding) {
mInstance0.rtmpInput(paramAnonymousArrayOfByte);
}
}
};
拍照及处理事件
camera.takePicture(null, null, new MyPictureCallback());
private final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
<span style="white-space:pre"> </span>//处理data数据
camera.startPreview(); // 拍完照后,重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}