Android使用摄像头案例
时间: 2023-12-04 16:40:46 浏览: 84
以下是一个简单的Android应用程序示例,演示如何使用摄像头进行拍照并显示预览:
1. 首先,在AndroidManifest.xml文件中添加相机权限:
```xml
<uses-permission android:name="android.permission.CAMERA" />
```
2. 创建一个新的Activity,并在布局文件中添加一个SurfaceView和一个按钮:
activity_main.xml:
```xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp"
tools:context=".MainActivity">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/buttonCapture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Capture"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
```
3. 在MainActivity中实现相机逻辑:
```java
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PictureCallback {
private SurfaceView mSurfaceView;
private Button mButtonCapture;
private Camera mCamera;
private SurfaceHolder mSurfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSurfaceView = findViewById(R.id.surfaceView);
mButtonCapture = findViewById(R.id.buttonCapture);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mButtonCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCamera != null) {
mCamera.takePicture(null, null, MainActivity.this);
}
}
});
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mSurfaceHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
e.printStackTrace();
}
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 处理拍照的图像数据
}
}
```
这个示例中,我们在 `surfaceCreated()` 方法中打开相机,设置预览的方向,将SurfaceView与相机关联,并开始预览。在 `surfaceChanged()` 方法中,我们处理SurfaceView的尺寸变化。在 `surfaceDestroyed()` 方法中,我们释放相机资源。当点击Capture按钮时,我们调用 `takePicture()` 方法进行拍照,并通过 `onPictureTaken()` 方法获取拍照的图像数据。
这只是一个简单的示例,实际上,您可能需要处理更多的相机参数设置、图像处理和错误处理等。此外,从 Android 5.0 (API level 21) 开始,推荐使用Camera2 API来操作相机。这个示例是基于Camera API的,如果您想使用Camera2 API,请参考官方文档和示例代码。
阅读全文