博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Controlling the Camera 控制相机
阅读量:4046 次
发布时间:2019-05-24

本文共 7253 字,大约阅读时间需要 24 分钟。

Directly controlling a device camera requires a lot more code than requesting pictures or videos from existing camera applications. However, if you want to build a specialized camera application or something fully integrated in your app UI, http://blog.csdn.net/sergeycao

Open the Camera Object

Getting an instance of the object is the first step in the process of directly controlling the camera. As Android's own Camera application does, the recommended way to access the camera is to open on a separate thread that's launched from . This approach is a good idea since it can take a while and might bog down the UI thread. In a more basic implementation, opening the camera can be deferred to the method to facilitate code reuse and keep the flow of control simple.

Calling throws an exception if the camera is already in use by another application, so we wrap it in a try block.

private boolean safeCameraOpen(int id) {    boolean qOpened = false;      try {        releaseCameraAndPreview();        mCamera = Camera.open(id);        qOpened = (mCamera != null);    } catch (Exception e) {        Log.e(getString(R.string.app_name), "failed to open Camera");        e.printStackTrace();    }    return qOpened;    }private void releaseCameraAndPreview() {    mPreview.setCamera(null);    if (mCamera != null) {        mCamera.release();        mCamera = null;    }}

Since API level 9, the camera framework supports multiple cameras. If you use the legacy API and call without an argument, you get the first rear-facing camera.

Create the Camera Preview

Taking a picture usually requires that your users see a preview of their subject before clicking the shutter. To do so, you can use a to draw previews of what the camera sensor is picking up.

Preview Class

To get started with displaying a preview, you need preview class. The preview requires an implementation of the android.view.SurfaceHolder.Callback interface, which is used to pass image data from the camera hardware to the application.

class Preview extends ViewGroup implements SurfaceHolder.Callback {    SurfaceView mSurfaceView;    SurfaceHolder mHolder;    Preview(Context context) {        super(context);        mSurfaceView = new SurfaceView(context);        addView(mSurfaceView);        // Install a SurfaceHolder.Callback so we get notified when the        // underlying surface is created and destroyed.        mHolder = mSurfaceView.getHolder();        mHolder.addCallback(this);        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }...}

The preview class must be passed to the object before the live image preview can be started, as shown in the next section.

Set and Start the Preview

A camera instance and its related preview must be created in a specific order, with the camera object being first. In the snippet below, the process of initializing the camera is encapsulated so that is called by the setCamera() method, whenever the user does something to change the camera. The preview must also be restarted in the preview class surfaceChanged() callback method.

public void setCamera(Camera camera) {    if (mCamera == camera) { return; }        stopPreviewAndFreeCamera();        mCamera = camera;        if (mCamera != null) {        List
localSizes = mCamera.getParameters().getSupportedPreviewSizes(); mSupportedPreviewSizes = localSizes; requestLayout(); try { mCamera.setPreviewDisplay(mHolder); } catch (IOException e) { e.printStackTrace(); } /* Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture. */ mCamera.startPreview(); }}

Modify Camera Settings

Camera settings change the way that the camera takes pictures, from the zoom level to exposure compensation. This example changes only the preview size; see the source code of the Camera application for many more.

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {    // Now that the size is known, set up the camera parameters and begin    // the preview.    Camera.Parameters parameters = mCamera.getParameters();    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);    requestLayout();    mCamera.setParameters(parameters);    /*      Important: Call startPreview() to start updating the preview surface. Preview must be      started before you can take a picture.    */    mCamera.startPreview();}

Set the Preview Orientation

Most camera applications lock the display into landscape mode because that is the natural orientation of the camera sensor. This setting does not prevent you from taking portrait-mode photos, because the orientation of the device is recorded in the EXIF header. The method lets you change how the preview is displayed without affecting how the image is recorded. However, in Android prior to API level 14, you must stop your preview before changing the orientation and then restart it.

Take a Picture

Use the method to take a picture once the preview is started. You can create and objects and pass them into .

If you want to grab images continously, you can create a that implements . For something in between, you can capture only selected preview frames, or set up a delayed action to call .

Restart the Preview

After a picture is taken, you must restart the preview before the user can take another picture. In this example, the restart is done by overloading the shutter button.

@Overridepublic void onClick(View v) {    switch(mPreviewState) {    case K_STATE_FROZEN:        mCamera.startPreview();        mPreviewState = K_STATE_PREVIEW;        break;    default:        mCamera.takePicture( null, rawCallback, null);        mPreviewState = K_STATE_BUSY;    } // switch    shutterBtnConfig();}

Stop the Preview and Release the Camera

Once your application is done using the camera, it's time to clean up. In particular, you must release the object, or you risk crashing other applications, including new instances of your own application.

When should you stop the preview and release the camera? Well, having your preview surface destroyed is a pretty good hint that it’s time to stop the preview and release the camera, as shown in these methods from the Preview class.

public void surfaceDestroyed(SurfaceHolder holder) {    // Surface will be destroyed when we return, so stop the preview.    if (mCamera != null) {        /*          Call stopPreview() to stop updating the preview surface.        */        mCamera.stopPreview();    }}/**  * When this function returns, mCamera will be null.  */private void stopPreviewAndFreeCamera() {    if (mCamera != null) {        /*          Call stopPreview() to stop updating the preview surface.        */        mCamera.stopPreview();            /*          Important: Call release() to release the camera for use by other applications.           Applications should release the camera immediately in onPause() (and re-open() it in          onResume()).        */        mCamera.release();            mCamera = null;    }}

Earlier in the lesson, this procedure was also part of the setCamera() method, so initializing a camera always begins with stopping the preview.

你可能感兴趣的文章
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>