来源:小编 更新:2025-02-25 09:00:38
用手机看
你有没有想过,你的手机里那个小小的摄像头,竟然能拍出那么清晰的照片和视频?今天,就让我带你一起探索安卓系统摄像头的奥秘,看看它是如何实现预览的,是不是很神奇呢?
想象当你打开手机摄像头,屏幕上立刻出现了一个实时的小窗口,里面展示着你眼前的世界。这就是摄像头预览的神奇之处。那么,它是怎么做到的呢?
1. 获取摄像头权限:首先,你的手机需要获取摄像头权限,这样才能访问摄像头硬件。在AndroidManifest.xml文件中添加以下权限:
```xml
```
如果你的应用需要访问外部存储,还需要添加存储权限:
```xml
```
2. 打开摄像头:在较旧的安卓版本(API 21及以下)中,可以使用以下方式打开摄像头:
```java
import android.hardware.Camera;
public class MainActivity extends AppCompatActivity {
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
camera = Camera.open();
}
}
```
在API 22及以上版本,建议使用Camera2 API,它提供了更加强大和灵活的摄像头控制功能。
3. 设置预览窗口:使用SurfaceView或TextureView作为预览窗口,将摄像头捕获的图像显示在屏幕上。
```java
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends AppCompatActivity {
private Camera camera;
private SurfaceView previewView;
private SurfaceHolder surfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
camera = Camera.open();
previewView = findViewById(R.id.preview_view);
surfaceHolder = previewView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 预览窗口大小变化时,调整摄像头预览参数
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
});
}
}
```
4. 调整预览参数:根据需要调整预览参数,如预览尺寸、对焦模式、白平衡等。
```java
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(parameters);
```
随着手机硬件的不断发展,现在的手机往往配备了多个摄像头,甚至还有外置摄像头。那么,如何获取所有可用的摄像头并实现预览呢?
1. 获取所有可用摄像头:使用CameraManager API获取所有可用的摄像头信息。
```java
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private CameraManager cameraManager;
private List
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
HandlerThread thread = new HandlerThread(\CameraThread\);
thread.start();
Handler handler = new Handler(thread.getLooper());
cameraManager.getCameraIdListAsync(handler, new CameraManager.GetCameraIdListCallback() {
@Override
public void onResult(List
cameraIds = cameraIdList;
}
});
}
}
```
2. 指定预览窗口:对于多摄像头,需要为每个摄像头指定一个预览窗口。
```java
for (String cameraId : cameraIds) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
// 获取预览窗口
SurfaceView previewView = findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = previewView.getHolder();
// 设置预览窗口
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
try {
camera.setPreviewDisplay(surfaceHolder);
camera.start