构建自定义的Camera应用程序

Android并不限制我们只能通过内置应用程序来访问硬件摄像头。我们有足够多的方法可以访问底层硬件,并且有许多与Camera应用程序本身一样的方法,而且能够在任何想要的应用程序类型中使用这些功能。

Android中使用Camera类访问该设备上的摄像头硬件,使我们能够真正捕获图像,并且可以通过其嵌套的Camera.Parameters类更改不同的属性设置,例如闪光灯激活以及白平衡的值,在清单文件中配置CAMERA权限;同样再开启摄像头之前,还需要创建某种类型的Surface,使得Camera应用程序能够在其上面绘制取景器或者预览图像。Suface是一个抽象类,表示绘制图像的位置。提供一个绘制Surface的简单方法是使用SurfaceView类。SurfaceView是标准视图中提供Surface的具体类;

为了在代码中实现通过Camera类使用此SurfaceView,需要添加一个SufaceHolder类。这个holder类可以作为Surface上的一个监听器,并且可以通过回调提供接口,从而让我们知道什么时候创建,销毁,或更改Surface。同时,Surfaceview 类还提供一个getHolder方法,用于获得对应其Surface的SurfaceHolder对象。



使用代码:

package com.example.administrator.media2;

import android.content.pm.ActivityInfo;
import android.graphics.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    private SurfaceView surfaceView;
    private android.hardware.Camera camera;

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

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        surfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview);

        SurfaceHolder surfaceHolder = surfaceView.getHolder();//holder作为SurfaceView的监听器
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        //给这个holder设置一个回调,用于监听SurfaceView的创建毁掉等
        surfaceHolder.addCallback(this);


    }

    //当Surfaca已经创建的时候呢,我们就要准备好开始使用实际的Camera对象le
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        camera = android.hardware.Camera.open();
        //最后一步是讲预览显示设置为正在使用的SufaceHolder
        try {
            camera.setPreviewDisplay(surfaceHolder);
        } catch (IOException e) {
            camera.release();
        }
        //最后启动摄像头预览
        camera.startPreview();
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.startPreview();
        camera.release();
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值