Android - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

Android

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:38

Android -- Camera2(Android5.0)


Camera2


Camera2是Android5.0中的个一一个新的特点,新的API。与本来的camera API比拟,不合之处在于:
  • 原生支撑RAW照片输出
  • 突发拍摄模式

制约拍┞氛速度的不再是软件而是硬件。以Nexus 5为例,分辨率全开下Andorid L的连拍速度可达到30fps。
  • 全手动控制

快门、感孤┤、对焦、测光、硬件视频防抖等多种参数都被整合到了新的API内。新的API中添加的手动控制功能列表:
  1. 感孤┤
  2. 手动对焦/AF开关
  3. AE/AF/AWB模式
  4. AE/AWB锁
  5. 硬件视频防抖
  6. 持续帧

干货


Camera2 法度榜样逻辑与原Camera有很大年夜不合。
CameraManager,体系办事,经由过程 CameraManager去获得camera设备对象。CameraDevices供给描述相机硬件设备支撑可用的和输出的参数,这些信息经由过程 CameraCharacteristics获得,CameraCharacteristics又是大年夜 getCameraCharacteristics(cameraId缉获得,经由过程freamwork中的源码发明,其拭魅这里就是直接调用的Camera API接口。
经由过程camera拍┞氛,应用起重要创建由相机设备的输出surface构成的拍┞氛会话,createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)。每个surface必须预先设置恰当的大年夜小和格式去匹配相机设备的可支撑的大年夜小和格式。一个目标surface可以大年夜不合的类中获取,包含SurfaceView,SurfaceTexture via Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, and ImageReader.
一旦请求被建立,他可以交给晃荡的拍┞氛会话:一次拍┞氛(one-shot )或者无尽头持续拍┞氛或预览(Repeating)」现办法都有一个其他的方法:接收一系列的请求作为burst拍┞氛/反复burst。
public void openCamera (String cameraId, CameraDevice.StateCallback callback, Handler handler)

应用getCameraIdList()来获得可用摄像设备的列表。一旦成功打开相机,CameraDevice.StateCallback中的onOpened(CameraDevice)将被调用。相机设备可以经由过程调用createCaptureSession()和createCaptureRequest()去设置操作。如不雅打开相机设备掉败,那么设备回调的onError办法将被调用,和后续调用相机设备将抛出一个CameraAccessException。
public abstract CaptureRequest.Builder createCaptureRequest (int templateType)

为请求拍┞氛创建一个CaptureRequest.Builder,初始化目标用例的模板。选择最好的设置为特定的相机设备,所以不建议为不合的相机设备重用雷同的请求,创建一个builder为具体的设备和模板和根据须要覆盖的设置。
[img]http://images.cnitblog.com/blog/587773/201501/042023147478117.png
public abstract void createCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)

晃荡着的会话决定了相机的output Surfaces 为每个拍┞氛的请求。给定请求可以应用全部或只有部分的output Surfaces。一旦CameraCaptureSession创建,可以提交capture请求、captureBurst请求,setRepeatingRequest请求或setRepeatingBurst请求。

权限


<uses-permission android:name="android.permission.CAMERA"/>

构造


[img]http://common.cnblogs.com/images/copycode.gif
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextureView
        android:id="@+id/textureview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

</LinearLayout>

[img]http://common.cnblogs.com/images/copycode.gif

核心代码


[img]http://common.cnblogs.com/images/copycode.gif
public class CameraFragment extends Fragment implements TextureView.SurfaceTextureListener {

    private TextureView mPreviewView;
    private Handler mHandler;
    private HandlerThread mThreadHandler;
    private Size mPreviewSize;
    private CaptureRequest.Builder mPreviewBuilder;

    public static CameraFragment newInstance() {
        return new CameraFragment();
    }

    @SuppressWarnings("ResourceType")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.camera_frag, null);
        initLooper();
        initUIAndListener(v);
        return v;
    }
    //很多过程都变成了异步的了,所以这里须要一个子线程的looper
    private void initLooper() {
        mThreadHandler = new HandlerThread("CAMERA2");
        mThreadHandler.start();
        mHandler = new Handler(mThreadHandler.getLooper());
    }
    //可以经由过程TextureView或者SurfaceView
    private void initUIAndListener(View v) {
        mPreviewView = (TextureView) v.findViewById(R.id.textureview);
        mPreviewView.setSurfaceTextureListener(this);
    }

    @SuppressWarnings("ResourceType")
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        try {
            //获得CameraManager
            CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
            //获得属性
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics("0");
            //支撑的STREAM CONFIGURATION
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            //显示的size
            mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];
            //打开相机
            cameraManager.openCamera("0", mCameraDeviceStateCallback, mHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }

    //TextureView.SurfaceTextureListener
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }

    private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {

        @Override
        public void onOpened(CameraDevice camera) {
            try {
                startPreview(camera);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDisconnected(CameraDevice camera) {

        }

        @Override
        public void onError(CameraDevice camera, int error) {

        }
    };
    //开端预览,主如果camera.createCaptureSession这段代码很重要,创建会话
    private void startPreview(CameraDevice camera) throws CameraAccessException {
        SurfaceTexture texture = mPreviewView.getSurfaceTexture();
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface surface = new Surface(texture);
        try {
            mPreviewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        mPreviewBuilder.addTarget(surface);
        camera.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, mHandler);
    }

    private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {

        @Override
        public void onConfigured(CameraCaptureSession session) {
            try {
                updatePreview(session);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onConfigureFailed(CameraCaptureSession session) {

        }
    };

    private void updatePreview(CameraCaptureSession session) throws CameraAccessException {
        session.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
    }
}

[img]http://common.cnblogs.com/images/copycode.gif

我是天王盖地虎的瓜分线


源码:https://github.com/pinguo-yuyidong/Camera2
其他出色文┞仿文┞仿

Android KSOAP2调用.net webservice

jQuery教程(8)-DOM树操作之应用反向插入办法

android进修标记(34)应用AlertDialog创建简单对话框

android进修标记(33)画廊视图(Gallery)的功能和用法

android navidgation drawer 在导航抽屉中若何改变List选中项的...


更多关于android开辟文┞仿

相关案例查看更多