Android – 相机设置

本文介绍了如何在Android中使用Camera类实现拍照功能,包括相机预览、设置参数、自动对焦及拍照保存等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门 提供了Camera来处理相机相关的事件,Camera 是一个专门用来连接和断开相机服务的类,Camera 下面包括如下几个事件:

Camera.AutoFocusCallback: 自动调焦功能;
Camera.ErrorCallback:错误信息捕捉;
Camera.Parameters :相机的属性参数
Camera.PictureCallback:拍照、产生图片时触发;
Camera.PreviewCallback:相机预览设置;
Camera.ShutterCallback:快门设置;
Camera.Size:图片尺寸;

要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过 Camera.Parameters 对相机的一些属性进行设置,比如输出图片的格式、大小等等。下面是Camera类一些常用的方法介绍。

Camera类的方法
方法 说明

autoFocus 设置自动对焦
getParameters 得到相机的参数
open 启动相机服务
release 释放Camera服务
setPreviewDisplay 设置预览
setParameters 设置预览参数
startPreview 开始预览
stopPreview 停止预览
takePicture 拍照

这里重点说明一下拍照的方法和使用, takePicture 方法要实现3个回调函数,分别是: Camera.ShutterCallback (快门) 和 两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback 的 onPictureTaken 方法。onPictureTaken 中第一个参数就是图像数据, 第二个参数则是相机。

下面是一个相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。 我们先来看看在模拟器上的运行效果吧。


package eoe.zhimeng;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class Activity01 extends Activity {

private Preview mPreview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);

//Create our Preview view and set it as the content of our activity.
mPreview = new Preview(this);
setContentView(mPreview);
}

public boolean onKeyUp(int keyCode, KeyEvent event){
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
mPreview.takePicture();
break;
}
return true;
}
}
/*Preview-显示Preview*/
class Preview extends SurfaceView implements SurfaceHolder.Callback{

SurfaceHolder mHolder;
Camera mCamera;
Bitmap cameraBitmap;

public Preview(Context context) {
super(context);
//得到SurfaceHolder对象
mHolder = getHolder();
//添加回调函数
mHolder.addCallback(this);
//设置SurfaceHolder 的类型
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

//在Surface的大小发生改变时激发
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
/*构建Camera.Parameters对相机的参数进行设置*/
Camera.Parameters parameters = mCamera.getParameters();
/*设置拍照的图片格式*/
parameters.setPictureFormat(PixelFormat.JPEG);
/*设置Preview(预览)的尺寸*/
parameters.setPreviewSize(320, 480);
mCamera.setParameters(parameters);
/*开始预览*/
mCamera.startPreview();
}

/*拍照片*/
public void takePicture(){
if (mCamera != null) {
mCamera.takePicture(null, null, jpegCallback);
}
}
/*拍照后输出图片*/
private PictureCallback jpegCallback = new PictureCallback(){

@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Handle JPEG image data
//解码一个不可变的位图 从指定的字节数组
cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File myCaptureFile = new File("/sdcard/camera1.jpg");
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
//压缩位图到指定的OutputStream
cameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
//刷新此缓冲区的输出流
bos.flush();
//关闭此输出流并释放与此流有关的所有系统资源
bos.close();
/*将拍到的图片绘制出来*/
//锁定画布
Canvas canvas = mHolder.lockCanvas();
canvas.drawBitmap(cameraBitmap, 0, 0, null);
//绘制后解锁,绘制后必须解锁才能显示
mHolder.unlockCanvasAndPost(canvas);
} catch (Exception e) {
e.getMessage();
}
}
};

//在创建Surface时激发
@Override
public void surfaceCreated(SurfaceHolder holder) {
/*启动Camera*/
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (Exception e) {
/*释放mCamera*/
mCamera.release();
mCamera = null;
}
}

//在销毁Surface时激发
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
/*停止预览*/
mCamera.stopPreview();
mCamera = null;
}
}


<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
Android中,调用相机通常涉及到使用系统的Camera API或更现代的CameraX库。以下是基本步骤: 1. **权限检查**:确保在AndroidManifest.xml文件中添加了使用相机的权限 `<uses-permission android:name="android.permission.CAMERA" />`。 2. **环境检测**:在运行时检查设备是否支持相机,是否有可用的相机。 3. **选择相机接口**: - Camera API(适用于API级别19及以上):`Camera` 类和 `CameraPreview` 用于打开相机并显示预览。 - CameraX(推荐,从API级别21开始):`CameraX` 提供了更简洁的API,如 `CameraSelector`, `CameraCaptureSession` 和 `ImageCapture`。 4. **创建相机实例**: - Camera API: 实例化 `Camera` 对象,并监听其预览。 - CameraX: 使用 `CameraSelector` 创建 `CameraProvider` 并选择相机。 5. **设置预览**: - Camera API: 设置 `SurfaceView` 为预览输出。 - CameraX: 创建 `SurfaceControl` 对象并将预览输出到该视图。 6. **拍照或录像**: - Camera API: 调用 `takePicture()` 或 `startPreview()`。 - CameraX: 使用 `CaptureRequest` 和 `CaptureSession` 进行拍摄或录像。 7. **处理结果**:对于拍照,需要在回调中处理图片数据;录像则需要处理视频流。 8. **关闭相机**: - Camera API: 释放 `Camera` 对象。 - CameraX: 使用 `cameraProvider.unbindAll()` 关闭连接。 ```java // 示例代码片段(使用CameraX) CameraX.cameraSelector(CameraSelector.DEFAULT_BACK_CAMERA) .bindToLifecycle(lifecycleOwner) .addOnSuccessListener { camera –> val preview = Preview.Builder().build() val captureSession = camera.createCaptureSession(arrayOf(preview.surface)) preview.setOnPreviewOutputUpdateListener { _, _ -> captureSession.configure(CaptureRequest.Builder().build()) } captureSession.startCapture(CaptureRequest.Builder().build(), null) } .addOnFailureListener { e –> // 处理错误 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值