Android写一个拍照并且显示在屏幕上面的程序
时间: 2023-05-28 12:07:46 浏览: 47
以下是一个Android拍照并显示在屏幕上的示例代码:
XML布局文件:
```xml
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/button_capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Capture"
android:layout_gravity="center_horizontal|bottom" />
```
MainActivity.java文件:
```java
public class MainActivity extends AppCompatActivity {
private Camera mCamera;
private CameraPreview mPreview;
private Button mCaptureButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建一个Camera实例
mCamera = getCameraInstance();
// 创建一个预览视图并将其设置为FrameLayout中的子视图
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
// 设置拍照按钮的点击监听器
mCaptureButton = (Button) findViewById(R.id.button_capture);
mCaptureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 拍照
mCamera.takePicture(null, null, mPicture);
}
});
}
/** 获取Camera实例 */
private Camera getCameraInstance() {
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
// 打开相机失败
}
return c;
}
/** 在屏幕上显示拍摄的照片 */
private void displayCapturedPhoto(byte[] data) {
// 将数据转换为位图
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
// 创建一个ImageView并将位图设置为其图像
ImageView imageView = new ImageView(this);
imageView.setImageBitmap(bitmap);
// 创建一个AlertDialog并将ImageView设置为其视图
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(imageView)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 关闭对话框
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
/** 拍照后保存照片数据的回调函数 */
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 显示拍摄的照片
displayCapturedPhoto(data);
// 重新启动预览
camera.startPreview();
}
};
@Override
protected void onPause() {
super.onPause();
// 释放相机资源
releaseCamera();
}
/** 释放相机资源 */
private void releaseCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
}
```
CameraPreview.java文件:
```java
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
// 获取SurfaceHolder并设置其回调
mHolder = getHolder();
mHolder.addCallback(this);
// 预览视图为透明
mHolder.setFormat(PixelFormat.TRANSPARENT);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 将预览视图与相机关联起来
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
// 开始相机预览失败
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 如果预览视图发生变化,先停止预览
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
// 无法停止相机预览
}
// 启动相机预览
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
// 开始相机预览失败
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 释放相机资源
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
}
```