如何在片段中显示相机看到的内容?

时间:2018-04-16 10:41:39

标签: java android camera

应用程序的目的是基本比较相机的视线与图库中的图像。我不知道哪个控件可以在不打开默认系统应用程序的情况下访问摄像头。

我知道这个应用程序在分屏手机(一侧是摄像头,另一侧是图库)上没用,但是用于没有牛轧糖功能的手机(棉花糖或棒棒糖)。

我见过一些显示相机的应用程序,如条形码阅读器和一些快速照片编辑器。

enter image description here

1 个答案:

答案 0 :(得分:6)

您可以使用Camera api。您需要创建自己的SurfaceView以显示相机所看到的内容的预览。互联网上有很多关于此的教程。

public class ImageSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private Camera camera;
    private SurfaceHolder surfaceHolder;

    public ImageSurfaceView(Context context, Camera camera) {
        super(context);
        this.camera = camera;
        this.surfaceHolder = getHolder();
        this.surfaceHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            this.camera.setPreviewDisplay(holder);
            this.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) {
        this.camera.stopPreview();
        this.camera.release();
    }
}



public class MainActivity extends Activity  implements SensorEventListener {
    private Camera mCamera;
    private ImageSurfaceView cameraView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    protected void onResume(){
        super.onResume();
        mCamera = getCameraInstance();
        mCamera.setDisplayOrientation(90);
        cameraView = new ImageSurfaceView(this, mCamera);
        mainView.addView(cameraView);
        mainView.bringChildToFront(buttonView);
        senSensorManager.registerListener(this, senRotation, SensorManager.SENSOR_DELAY_GAME);
    }

    /** A safe way to get an instance of the Camera object. */
    public Camera getCameraInstance(){
        Camera c = null;
        try{
            c = Camera.open(); // attempt to get a Camera instance
            Camera.Parameters parameters = c.getParameters();
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            c.setParameters(parameters);
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }

        return c; // returns null if camera is unavailable
    }
}