1、camera2api的部分描述:
|
api地址:https://developer.android.com/reference/android/hardware/camera2/package-summary.html
用於捕捉相機圖像或從相機中捕捉到的圖像的攝像機的配置捕捉會話 |
CameraCaptureSession.CaptureCallback | 用於跟蹤提交給相機設備的CaptureRequest進程的回調對象。 |
CameraCaptureSession.StateCallback | 一個回調對象,用於接收關於攝像機捕獲會話狀態的更新。 |
CameraCharacteristics | 描述一個攝像機的屬性。 |
CameraCharacteristics.Key<T> | 相機特性 |
CameraConstrainedHighSpeedCaptureSession | 一種受限的高速捕獲通道,用於捕捉高速視頻記錄用例的高速圖像。 |
CameraDevice | 這款相機是一款與Android設備相連的單機相機,可以在高幀率下對圖像捕捉和后處理進行精細控制 |
CameraDevice.StateCallback | 一個回調對象,用於接收有關相機設備狀態的更新。 |
CameraManager |
|
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>