Android 笔记之 camera的控制---旧API

这篇博客介绍了Android已废弃的硬件.camera API如何控制摄像头,包括打开摄像头、预览设置、参数调整和变焦功能。通过设置SurfaceView预览画面,调整参数以设置预览格式,并实现变焦功能。强调在实际使用中需要注意错误处理,并指出对于更深入的相机功能如对焦和摄像,应考虑使用新的camera2 API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Camera的控制

5.0以后,Android发布了新的摄像头控制API,称之为camera2
现在讲的是已经deprecated的android.hareware.camera,来控制摄像头

很简单,Camera mCamera = Camera.open()打开摄像头实例
如果不设置参数,默认打开后摄像头,一般情况参数1是前摄像头
具体的看API文档Android.hardware.camera
然后对其进行控制。

预览

要拍照首先要预览,通常用surfaceView来预览。
然后需要一个SurfaceHoler来连接camera和surfaceView.
所有需要SurvaceHolder mHolder = mSurfaceView.getHolder()来获取实例。
然后对Holder如下操作

mHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                initCamere();
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                if(mCamera!=null)
                {
                    if(isPreview)mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                }
            }
        });

这三个被覆盖的方法顾名思义,都是完成生命周期的功能,分别对应view的创建,改变,销毁
记得在销毁里面释放camera,因为这个资源一次只能有一个APP来操作。
然后有如下:
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
来设置buffer状态,说实在的我也搞不懂是啥,没仔细看文档,都是这么设置的,就这样吧。

Holder设置好了,下面就连接holder和mCamera
mCamera.setPreviewDisplay(mHolder);
然后就可以开始预览了
mCamera.startPreview();
停止就是stopPreview()
释放摄像头资源就是release()

参数

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(1280,720);
mCamera.setParameters(parameters);

第一行是获得摄像头的参数,第二行就是设置参数,内容很多种,这个是设置预览的格式
然后必须设置第三行,才能使得参数生效。

变焦

if(parameters.isZoomSupported())
                {
                    parameters.setZoom(60);
                }

这个变焦我弄了一晚上,上网查,其实就是这么简单三行而已。
参数设置里面有个setZoom,就是设置变焦数值
注意,变焦数值可能不同设备有区别
parameters.getMaxZoom()可以获得最大数值,然后在1到这个数值之间设置
如果返回0,就表示不能变焦。

记得在设置边角前一定要检查是否支持变焦
就是isZoomSupported()这一句,我在模拟器上获得的结果是不支持变焦,苦恼了很久以为是物理变焦才支持。后来直接在NOTE3上试验,发现是支持的。所以,一切需要在实机上测试为准

还有个类似的isSoomthZoomSupported()我的手机上是false,不知道是什么状况,反正用前一种就好。

总结

基本上都是很简单易懂的,直接看API文档就可以理解。其他的功能比如对焦,摄像,保存图片暂时没有深入研究,下次要学习camera2也就是新的API。
实际使用中需要添加更多的try catch块来避免错误。
练习完成的代码

public class CameraActivity extends AppCompatActivity {
    private Camera mCamera;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mHolder;
    private boolean isPreview = false;
    private Activity context = this;

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

        final RelativeLayout layout = (RelativeLayout)findViewById(R.id.layout);
        Button btnTake = (Button)findViewById(R.id.btn_take);
        btnTake.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MsgManager.simpleLongSnackbar(layout,String.valueOf(mCamera.getParameters().getMaxZoom()));
                MsgManager.makeLongToast(context,String.valueOf(mCamera.getParameters().isSmoothZoomSupported())).show();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView_camera);

        initView();
    }

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

        if(mCamera!=null) {
            mCamera.release();
            mCamera = null;
        }
    }

    public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }

    private void initView() {
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                initCamere();
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                if(mCamera!=null)
                {
                    if(isPreview)mCamera.stopPreview();
                    mCamera.release();
                    mCamera = null;
                }
            }
        });
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    private void initCamere() {
        if(!isPreview)
        {
            mCamera = Camera.open();
            mCamera.setDisplayOrientation(90);
        }
        if(mCamera!=null&&!isPreview)
        {
            try {
                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewSize(1280,720);
                if(parameters.isZoomSupported())
                {
                    parameters.setZoom(60);
                }
                mCamera.setParameters(parameters);
                mCamera.setPreviewDisplay(mHolder);
                mCamera.startPreview();
            }catch (Exception e)
            {
                e.printStackTrace();
            }
            isPreview = true;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值