我正在尝试制作一个需要使用摄像头实时供稿作为背景的应用程序。(我知道这是一件愚蠢的事情,但无能为力,这是客户的需求)。
我已经尝试过使用SurfaceView
但到目前为止没有成功。
到目前为止,我在 Stack Overflow 上发现的更多是猜测或指导如何去做,但没有实时示例或代码帮助。如果有人在与像我这样的 Stack Overflow 用户共享一段代码之前这样做过,那就太好了。
我正在尝试制作一个需要使用摄像头实时供稿作为背景的应用程序。(我知道这是一件愚蠢的事情,但无能为力,这是客户的需求)。
我已经尝试过使用SurfaceView
但到目前为止没有成功。
到目前为止,我在 Stack Overflow 上发现的更多是猜测或指导如何去做,但没有实时示例或代码帮助。如果有人在与像我这样的 Stack Overflow 用户共享一段代码之前这样做过,那就太好了。
package com.example.CameraPreview;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraView(Context context) {
super(context);
if(checkCameraHardware(context)) {
mCamera = getCameraInstance();
}
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
if(checkCameraHardware(context)) {
mCamera = getCameraInstance();
}
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
// The Surface has been created, now tell the camera where to draw the preview.
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("CameraView", "Error setting camera preview: " + e.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
if (mHolder.getSurface() == null){
return;
}
try {
mCamera.stopPreview();
} catch (Exception e){
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d("CameraView", "Error starting camera preview: " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
return true;
} else {
return false;
}
}
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
}
catch (Exception e){
}
return c;
}
}