切换/前置摄像头飞 [英] switch back/front camera on fly

查看:241
本文介绍了切换/前置摄像头飞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我只用CAMERA_FACING_BACK或CAMERA_FACING_FRONT一切工作正常。 我有从CAMERA_FACING_BACK开关CAMERA_FACING_FRONT麻烦。 我的code段

 公共类PhotoCameraActivity扩展活动实现OnClickListener {
私人SurfaceView cameraView;
私人按钮turnButton;
私人相机拍照= NULL;
私人回调监听;
私有静态诠释CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.photo_camera_main);
    prepareActivity();
}

私人无效prepareActivity(){
    cameraView =(SurfaceView)findViewById(R.id.photo_camera_surface_view);

    turnButton =(的ImageButton)findViewById(R.id.turn_button);
    turnButton.setOnClickListener(本);
}

@覆盖
公共无效的onClick(视图v){
    如果(v.equals(turnButton)){
        { - 如果(1 Camera.getNumberOfCameras()Camera.getNumberOfCameras()→1&安培;&安培; CAMID&公升)
            startCamera(CAMID + 1);
        } 其他 {
            startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
        }
    }
}

@覆盖
保护无效onResume(){
    startCamera(CAMID);
    super.onResume();
}

@覆盖
保护无效的onPause(){
    stopCamera();
    super.onPause();
}

私人无效startCamera(INT cameraId){
    如果(相机!= NULL){
        stopCamera();
    }
    支架= cameraView.getHolder();
    监听=新的回调(){

        @覆盖
        公共无效surfaceDestroyed(SurfaceHolder持有者){
        }

        @覆盖
        公共无效surfaceCreated(SurfaceHolder持有者){
            尝试 {
                camera.set previewDisplay(保持器);
                camera.start preVIEW();
            }赶上(IOException异常E){
                e.printStackTrace();
            }
        }

        @覆盖
        公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){}
    };
    holder.addCallback(听众);


    CAMID = cameraId;
    摄像头= Camera.open(cameraId);
    Camera.Parameters PARAMS = camera.getParameters();
    如果(cameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
        params.set previewSize(1280,800);
    } 其他 {
        params.set previewSize(640,480);
    }
    camera.setParameters(PARAMS);

}

私人无效stopCamera(){
    的System.out.println(stopCamera法);
    如果(相机!= NULL){
        camera.stop preVIEW();
        camera.set previewCallback(空);
        camera.release();
        摄像头= NULL;
        holder.removeCallback(听众);
        支架=无效;
    }
}

    }
 

解决方案

我重新启动与cameraId = 2的活动,这是工作。

If I use only CAMERA_FACING_BACK or CAMERA_FACING_FRONT all works fine. I have trouble with switch from CAMERA_FACING_BACK to CAMERA_FACING_FRONT. My code snippet

public class PhotoCameraActivity extends Activity implements OnClickListener {
private SurfaceView cameraView;
private Button turnButton;
private Camera camera = null;
private Callback listener;
private static int camId = Camera.CameraInfo.CAMERA_FACING_BACK;

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

private void prepareActivity() {
    cameraView = (SurfaceView) findViewById(R.id.photo_camera_surface_view);

    turnButton = (ImageButton) findViewById(R.id.turn_button);
    turnButton.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if (v.equals(turnButton)) {
        if (Camera.getNumberOfCameras() > 1 && camId < Camera.getNumberOfCameras() - 1) {
            startCamera(camId + 1);
        } else {
            startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
        }
    } 
}

@Override
protected void onResume() {
    startCamera(camId);
    super.onResume();
}

@Override
protected void onPause() {
    stopCamera();
    super.onPause();
}

private void startCamera(int cameraId) {
    if (camera != null) {
        stopCamera();
    }       
    holder = cameraView.getHolder();
    listener = new Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int           width, int height) {}
    };
    holder.addCallback(listener);


    camId = cameraId;
    camera = Camera.open(cameraId);
    Camera.Parameters params = camera.getParameters();
    if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
        params.setPreviewSize(1280, 800);
    } else {
        params.setPreviewSize(640, 480);
    }
    camera.setParameters(params);

}

private void stopCamera(){
    System.out.println("stopCamera method");
    if (camera != null){
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;
        holder.removeCallback(listener);
        holder = null;
    }
}

    }

解决方案

I restart Activity with cameraId = 2 and this is working.

这篇关于切换/前置摄像头飞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆