android camera2


1、camera2api的部分描述:

 

 

 

 

 

CameraCaptureSession

api地址:https://developer.android.com/reference/android/hardware/camera2/package-summary.html

 

 

 

 

用於捕捉相機圖像或從相機中捕捉到的圖像的攝像機的配置捕捉會話

CameraCaptureSession.CaptureCallback

用於跟蹤提交給相機設備的CaptureRequest進程的回調對象。

CameraCaptureSession.StateCallback 一個回調對象,用於接收關於攝像機捕獲會話狀態的更新。
CameraCharacteristics

描述一個攝像機的屬性。 CameraDevice

CameraCharacteristics.Key<T> 相機特性
CameraConstrainedHighSpeedCaptureSession 一種受限的高速捕獲通道,用於捕捉高速視頻記錄用例的高速圖像。
CameraDevice

這款相機是一款與Android設備相連的單機相機,可以在高幀率下對圖像捕捉和后處理進行精細控制

CameraDevice.StateCallback 一個回調對象,用於接收有關相機設備狀態的更新。
CameraManager

用於檢測、描述和連接的系統服務管理器 CameraDevices

CameraManager.AvailabilityCallback 於攝像機設備的回調,描述相機可用或無法打開
CameraManager.TorchCallback 攝像機閃光燈模式的回調,即不可用、禁用或啟用。
CameraMetadata<TKey> 相機控制和信息的基類 
CaptureFailure 圖像傳感器捕獲單個圖像捕獲失敗
CaptureRequest

一個不可變的設置和輸出包,需要從攝像機設備中捕獲一個圖像

CaptureRequest.Builder 構建器捕獲請求
CaptureRequest.Key<T> 個鍵用於捕獲請求字段查找 get(CaptureResult.Key)  或設置 set(Key, Object)
CaptureResult

從圖像傳感器中捕獲的單個圖像的子集

CaptureResult.Key<T> 捕獲結果字段
DngCreator dng主類提供了將原始像素數據寫入DNG文件的功能。
TotalCaptureResult

從圖像傳感器中捕獲的單個圖像的總聚集結果

 2、詳見代碼:

package com.admin.smartcam.androidcamera.camera2;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.view.Surface;
import android.view.TextureView;
import android.widget.Toast;

import com.admin.smartcam.service.SmartCamService;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import static android.content.Context.CAMERA_SERVICE;
import static com.admin.smartcam.service.SmartCamService.handler;

/**
 * Created by Admin on 2017/6/2 0002.
 */

@RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class TextureViewPreview extends TextureView implements TextureView.SurfaceTextureListener {
    private Context context;
    private CameraManager cameraManager;
    private CameraDevice cameraDevice;
    public static CaptureRequest.Builder mPreviewBuilder;
    public static MediaRecorder mMediaRecorder;
    public TextureViewPreview(Context context) {
        super(context);
        this.context = context;
        setSurfaceTextureListener(this);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
        openCamera();
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

    }

    /**
     * 第一步
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private boolean openCamera() {
        cameraManager = (CameraManager) context.getSystemService(CAMERA_SERVICE);//獲得相機服務
        try {
            String[] CameraIdList = cameraManager.getCameraIdList();
            //獲取可用相機設備列表
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(CameraIdList[0]);
            //在這里可以通過CameraCharacteristics設置相機的功能,須檢查是否支持
            characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
            //就像這樣
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
            try {
                cameraManager.openCamera(CameraIdList[0], new CameraDevice.StateCallback() {

                    @Override
                    public void onOpened(CameraDevice cameraDevice) {
                        startView(cameraDevice);
                    }

                    @Override
                    public void onDisconnected(CameraDevice cameraDevice) {
                        cameraDevice.close();
                    }

                    @Override
                    public void onError(CameraDevice cameraDevice, int i) {
                        cameraDevice.close();
                    }
                }, handler);

            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
            return true;
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 第二步
     * 啟動預覽
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void startView(CameraDevice cameraDevice) {
        //setUpMediaRecorder();
        SurfaceTexture surfaceTexture=this.getSurfaceTexture();
        if (surfaceTexture!=null) {
            Surface surface = new Surface(surfaceTexture);
            try {
                //預覽請求
                mPreviewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
            mPreviewBuilder.addTarget(surface);
            //mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
            try {

                cameraDevice.createCaptureSession(Arrays.asList(surface),
                        new AandroidCaptureSessionCallBack(), SmartCamService.handler);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }else Toast.makeText(context,"那個為空我也很無奈啊!", Toast.LENGTH_SHORT).show();
    }


    /**
     * 設置錄像
     **/
    private void setUpMediaRecorder() {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setProfile(CamcorderProfile.get(6));//設置分辨率為1080
        mMediaRecorder.setOutputFile(initPath(getDate()).getAbsolutePath());
        try {
            mMediaRecorder.prepare();
            //mMediaRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取系統當前時間
     *
     * @return
     */
    private String getDate() {
        String savedate = null;
        savedate = System.currentTimeMillis() + ".mp4";
        return savedate;
    }

    /**
     * 初始化保存路徑
     */
    private static File initPath(String saverPath) {
        File filesd = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), saverPath);//在SD
        File file=Environment.getDataDirectory();//獲取手機內存目錄
        if (saverPath.equals("")) {
            if (!filesd.exists()) {
                filesd.mkdirs();
            }
        }
        return file;
    }
}

 

package com.admin.smartcam.androidcamera.camera2;

import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.widget.Toast;

import com.admin.smartcam.main.MainActivity;
import com.admin.smartcam.service.SmartCamService;

import static com.admin.smartcam.androidcamera.camera2.TextureViewPreview.mPreviewBuilder;
import static com.admin.smartcam.main.MainActivity.count;

/**
 * 第三步
 * Created by Admin on 2017/4/23 0023.
 * 將處理預覽和拍照圖片的工作
 * 攝像頭采集狀態回調
 */

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AandroidCaptureSessionCallBack extends CameraCaptureSession.StateCallback {
    @Override
    public void onConfigured(CameraCaptureSession cameraCaptureSession) {
        try {

            mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

            //cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            Toast.makeText(MainActivity.context,"AandroidCaptureSessionCallBack:>>>:"+count++, Toast.LENGTH_SHORT).show();
            cameraCaptureSession.capture(mPreviewBuilder.build(),
                    new AndroidCaptureCallback(), SmartCamService.handler);//數據回掉接口
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
//        cameraCaptureSession.getInputSurface().lockCanvas(new Rect(1,1,1,11));
    }
}

 

package com.admin.smartcam.androidcamera.camera2;

import android.graphics.Bitmap;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;

/**
 * 第四步
 * Created by Admin on 2017/4/23 0023.
 * 包含兩個狀態,采集進行,采集完成
 可以在這里面去做處理,
 *數據回掉接口
 *攝像頭采集回話采集狀態的回調
 */

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AndroidCaptureCallback extends CameraCaptureSession.CaptureCallback {
    //在onCaptureCompleted中處理數據
    @Override
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                                   TotalCaptureResult result) {

        int afState =  result.get(CaptureResult.CONTROL_AF_STATE);
        if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState
                ||  CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState
                || CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED == afState) {
            //do something like save picture
            Bitmap bitmap=(Bitmap) request.getTag();
            Log.d("數據處理》》", String.valueOf(bitmap.getHeight()));
            for (CaptureResult rs : result.getPartialResults())
            {
                rs.getFrameNumber();
            }
        }
    }

    @Override
    public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
                                    CaptureResult partialResult) {

    }


}

MainActivity.java

frameLayout = (FrameLayout) findViewById(R.id.camera_FrameLayout);
            textureViewPreview = new TextureViewPreview(this);
            //textureViewPreview.setAlpha(0.5f);//設置透明度

            frameLayout.addView(textureViewPreview);





布局:
<FrameLayout
    android:id="@+id/camera_FrameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</FrameLayout>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM