有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将frontcamera添加到SurfaceView并使用它拍照?

你好

我怎样才能像使用“REAL camera”那样将前置摄像头视图添加到SurfaceView。这是我的代码:

摄像活动。java

   **public class CameraActivity extends Activity implements SurfaceHolder.Callback{

    Camera camera;

    @InjectView(R.id.s)
    SurfaceView surfaceView;

    @InjectView(R.id.takeaphoto)
    ImageView imageView;
    SurfaceHolder surfaceHolder;
   Camera.PictureCallback callback;
    private int cameraId = 0;
    Camera.ShutterCallback shutterCallback;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.camera_activity);



        ButterKnife.inject(this);
        surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
cameraImage();
            }
        });
        callback = new 安卓.hardware.Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, 安卓.hardware.Camera camera) {
                FileOutputStream outputStream=null;
                File file_image = getDirc();

                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyymmddhhmms");
                String date = simpleDateFormat.format(new Date());
                String photo_file="PI_"+date+".jpg";
                String file_name = file_image.getAbsolutePath()+"/"+photo_file;
                File picfile=new File(file_name);

                try {

                    outputStream=new FileOutputStream(picfile);
                    outputStream.write(bytes);
                    outputStream.close();


                }catch (FileNotFoundException e){}
                catch (IOException ex){}
                finally {

                }
                refreshCamera();
                refreshGallery(picfile);

                try {
                    camera.stopPreview();
                }catch (Exception e){}

                try{

                    camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();
                }catch (Exception e){}


            }


        };


    }
    private void refreshGallery(File file){
        Intent intent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(file));



    }

    public void refreshCamera(){

        if (surfaceHolder.getSurface() == null){

            return;

        }

    }

    private File getDirc(){

File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        return new File(dics ,"Camera");

    }

    public void cameraImage(){

        camera.takePicture(null , null ,callback);
       MediaPlayer mediaPlayer = MediaPlayer.create(this , R.raw.sound);
        mediaPlayer.start();

    }


    public void surfaceCreated(SurfaceHolder surfaceHolder ) {



try {
    camera = Camera.open(0);
}catch (RuntimeException ex){}
        Camera.Parameters parameters;
        parameters = camera.getParameters();
        parameters.setPreviewFrameRate(60);
        parameters.setPreviewSize(1920 , 1080);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);



        try {

            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();


        }catch (Exception e){



        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        refreshCamera();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();
        camera=null;

    }

    public void frontCamera(View view) {

        if (cameraId == 0){


            try {
                camera = Camera.open(1);
            }catch (RuntimeException ex){}

            try {

                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


            }catch (Exception e){



            }
        }

        else{

            try {
                camera = Camera.open(0);
            }catch (RuntimeException ex){}

            try {

                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


            }catch (Exception e){



            }

        }




    }




}**

和XML(如果需要的话):

   <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:layout_width="match_parent" 安卓:layout_height="match_parent">

    <RelativeLayout
        安卓:layout_width="match_parent"
        安卓:layout_height="match_parent"
        安卓:id="@+id/rel">

        <SurfaceView
            安卓:layout_width="match_parent"
            安卓:layout_height="match_parent"
            安卓:id="@+id/s">

        </SurfaceView>


        <RelativeLayout
            安卓:layout_width="match_parent"
            安卓:id="@+id/rel2"
            安卓:background="@color/colorPrimaryDark"
            安卓:layout_alignParentBottom="true"
            安卓:layout_height="150dp">

            <ImageView
                安卓:id="@+id/takeaphoto"
                安卓:background="@drawable/button_press"
                安卓:layout_height="80dp"
                安卓:layout_width="80dp"
                安卓:layout_centerVertical="true"
                安卓:layout_centerHorizontal="true" />

        </RelativeLayout>

        <RelativeLayout
            安卓:layout_width="match_parent"
            安卓:layout_height="50dp"
            安卓:id="@+id/rel1"
            安卓:background="@color/colorPrimaryDark"
            安卓:layout_alignParentTop="true"
            安卓:layout_alignParentStart="true">

            <ImageView
                安卓:layout_width="30dp"
                安卓:layout_marginEnd="10dp"
                安卓:layout_height="wrap_content"
                安卓:layout_alignParentRight="true"
                安卓:src="@drawable/switchcamera"
                安卓:id="@+id/imageView" />

        </RelativeLayout>

    </RelativeLayout>

</FrameLayout>

更新:现在以这种方式更新了我的代码,但仍然显示错误

An error occurred while connecting to camera: 1


共 (2) 个答案

  1. # 1 楼答案

    使用此方法获取前置摄像头的id,并将其作为参数传递给camera.open(int id) 我假设您想通过调用方法frontCamera(View view)来切换摄像头,我将该方法更改为switchCamera(View view),并对您的代码进行编辑,如下所示:

    public class CameraActivity extends Activity implements SurfaceHolder.Callback{
    
    Camera camera;
    
    @InjectView(R.id.s)
    SurfaceView surfaceView;
    
    @InjectView(R.id.takeaphoto)
    ImageView imageView;
    SurfaceHolder surfaceHolder;
    Camera.PictureCallback callback;
    private int cameraId = 0;
    Camera.ShutterCallback shutterCallback;
    private boolean frontCamera;
    
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.camera_activity);
    
    
    
        ButterKnife.inject(this);
        surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cameraImage();
            }
        });
        callback = new android.hardware.Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, android.hardware.Camera camera) {
                FileOutputStream outputStream=null;
                File file_image = getDirc();
    
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyymmddhhmms");
                String date = simpleDateFormat.format(new Date());
                String photo_file="PI_"+date+".jpg";
                String file_name = file_image.getAbsolutePath()+"/"+photo_file;
                File picfile=new File(file_name);
    
                try {
    
                    outputStream=new FileOutputStream(picfile);
                    outputStream.write(bytes);
                    outputStream.close();
    
    
                }catch (FileNotFoundException e){}
                catch (IOException ex){}
                finally {
    
                }
                refreshCamera();
                refreshGallery(picfile);
    
                try {
                    camera.stopPreview();
                }catch (Exception e){}
    
                try{
    
                    camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();
                }catch (Exception e){}
    
    
            }
    
    
        };
    
    
    }
    private void refreshGallery(File file){
        Intent intent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(file));
    
    
    
    }
    
    public void refreshCamera(){
    
        if (surfaceHolder.getSurface() == null){
    
            return;
    
        }
    
    }
    
    private File getDirc(){
    
        File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
        return new File(dics ,"Camera");
    
    }
    
    public void cameraImage(){
    
        camera.takePicture(null , null ,callback);
        MediaPlayer mediaPlayer = MediaPlayer.create(this , R.raw.sound);
        mediaPlayer.start();
    
    }
    
    
    public void surfaceCreated(SurfaceHolder surfaceHolder ) {
    
    
    
        try {
            camera = Camera.open(0);
        }catch (RuntimeException ex){}
        Camera.Parameters parameters;
        parameters = camera.getParameters();
        parameters.setPreviewFrameRate(60);
        parameters.setPreviewSize(1920 , 1080);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);
    
    
    
        try {
    
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
    
    
        }catch (Exception e){
    
    
    
        }
    
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        refreshCamera();
    
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();
        camera=null;
    
    }
    
    public void switchCamera(View view) {
    
        if (frontCamera){
    
    
            try {
                camera = Camera.open(defaultBackCamera());
            }catch (RuntimeException ex){}
    
            try {
    
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
    
    
            }catch (Exception e){
    
    
    
            }
        }
    
        else{
    
            try {
                camera = Camera.open(getFrontCameraId());
            }catch (RuntimeException ex){}
    
            try {
    
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
    
    
            }catch (Exception e){
    
    
    
            }
    
        }
    
    
    
    
    }
    
    
    private int getFrontCameraId() {
        int availableCameras = Camera.getNumberOfCameras();
        Camera.CameraInfo info = new Camera.CameraInfo();
        for (int i = 0; i < availableCameras; i++) {
            Camera.getCameraInfo(i, info);
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                frontCamera = true;
                return i;
            }
        }
        return -1;
    }
    
    private int defaultBackCamera() {
        int numberOfCameras = Camera.getNumberOfCameras();
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                frontCamera = false;
                return i;
            }
        }
        return -1;
    }
    
    
    
    
    }
    

    祝你好运

  2. # 2 楼答案

    修改这一行

    摄像头=安卓。硬件照相机open()

    摄像头=安卓。硬件照相机开放式(1)

    注:后凸轮使用id 0,前凸轮使用id 1。通常这对所有的fones都是一样的。所以我不认为每次都能找到id是不必要的