java - 如何显示 fragment 中相机看到的内容?

标签 java android camera

应用程序的目的是基本上比较相机看到的内容与画廊中的图像。我不知道哪个控件可以让您在不打开默认系统应用程序的情况下访问相机。

我知道此应用在分屏手机(一侧是摄像头,另一侧是图库)上无用,但旨在用于没有此 Nougat 功能的手机(棉花糖或 Lollipop )。

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

enter image description here

最佳答案

您可以使用相机 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
    }
}

关于java - 如何显示 fragment 中相机看到的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49855328/

相关文章:

java - 在java中使用正则表达式删除边距,填充属性

java - 是否有使用 Junrar 库读取第 5 版 RAR 文件的解决方案?

java - 二维数组中列的总和

android - 停止 ADB 服务器失败(代码 -1)。解压缩失败........(访问被拒绝) - Android Studio

android - 使用 asyncTask 更新 ListView

java - 将 X509 证书转换为 PEM 或 ASN.1/DER

android - 摄像机变焦

JAVA 在转换为同级类时避免重复代码

android - 将 flutter CameraImage 转换为文件

java - 屏幕锁定后相机预览卡住