知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
Android
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):52
Android -- Camera2(Android5.0)
Camera2
Camera2是Android5.0中的個(gè)一一個(gè)新的特點(diǎn),新的API。與本來的camera API比擬,不合之處在于:
- 原生支撐RAW照片輸出
- 突發(fā)拍攝模式
制約拍┞氛速度的不再是軟件而是硬件。以Nexus 5為例,分辨率全開下Andorid L的連拍速度可達(dá)到30fps。
- 全手動控制
快門、感孤┤、對焦、測光、硬件視頻防抖等多種參數(shù)都被整合到了新的API內(nèi)。新的API中添加的手動控制功能列表:
- 感孤┤
- 手動對焦/AF開關(guān)
- AE/AF/AWB模式
- AE/AWB鎖
- 硬件視頻防抖
- 持續(xù)幀
干貨
Camera2 法度榜樣邏輯與原Camera有很大年夜不合。
CameraManager,體系辦事,經(jīng)由過程 CameraManager去獲得camera設(shè)備對象。CameraDevices供給描述相機(jī)硬件設(shè)備支撐可用的和輸出的參數(shù),這些信息經(jīng)由過程 CameraCharacteristics獲得,CameraCharacteristics又是大年夜 getCameraCharacteristics(cameraId緝獲得,經(jīng)由過程freamwork中的源碼發(fā)明,其拭魅這里就是直接調(diào)用的Camera API接口。
經(jīng)由過程camera拍┞氛,應(yīng)用起重要?jiǎng)?chuàng)建由相機(jī)設(shè)備的輸出surface構(gòu)成的拍┞氛會話,createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)。每個(gè)surface必須預(yù)先設(shè)置恰當(dāng)?shù)拇竽暌剐『?#26684;式去匹配相機(jī)設(shè)備的可支撐的大年夜小和格式。一個(gè)目標(biāo)surface可以大年夜不合的類中獲取,包含SurfaceView,SurfaceTexture via Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, and ImageReader.
一旦請求被建立,他可以交給晃蕩的拍┞氛會話:一次拍┞氛(one-shot )或者無盡頭持續(xù)拍┞氛或預(yù)覽(Repeating)」現(xiàn)辦法都有一個(gè)其他的方法:接收一系列的請求作為burst拍┞氛/反復(fù)burst。
public void openCamera (String cameraId, CameraDevice.StateCallback callback, Handler handler)
應(yīng)用getCameraIdList()來獲得可用攝像設(shè)備的列表。一旦成功打開相機(jī),CameraDevice.StateCallback中的onOpened(CameraDevice)將被調(diào)用。相機(jī)設(shè)備可以經(jīng)由過程調(diào)用createCaptureSession()和createCaptureRequest()去設(shè)置操作。如不雅打開相機(jī)設(shè)備掉敗,那么設(shè)備回調(diào)的onError辦法將被調(diào)用,和后續(xù)調(diào)用相機(jī)設(shè)備將拋出一個(gè)CameraAccessException。
public abstract CaptureRequest.Builder createCaptureRequest (int templateType)
為請求拍┞氛創(chuàng)建一個(gè)CaptureRequest.Builder,初始化目標(biāo)用例的模板。選擇最好的設(shè)置為特定的相機(jī)設(shè)備,所以不建議為不合的相機(jī)設(shè)備重用雷同的請求,創(chuàng)建一個(gè)builder為具體的設(shè)備和模板和根據(jù)須要覆蓋的設(shè)置。
[img]http://images.cnitblog.com/blog/587773/201501/042023147478117.png
public abstract void createCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)
晃蕩著的會話決定了相機(jī)的output Surfaces 為每個(gè)拍┞氛的請求。給定請求可以應(yīng)用全部或只有部分的output Surfaces。一旦CameraCaptureSession創(chuàng)建,可以提交capture請求、captureBurst請求,setRepeatingRequest請求或setRepeatingBurst請求。
權(quán)限
<uses-permission android:name="android.permission.CAMERA"/>
構(gòu)造
[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; } //很多過程都變成了異步的了,所以這里須要一個(gè)子線程的looper private void initLooper() { mThreadHandler = new HandlerThread("CAMERA2"); mThreadHandler.start(); mHandler = new Handler(mThreadHandler.getLooper()); } //可以經(jīng)由過程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]; //打開相機(jī) 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) { } }; //開端預(yù)覽,主如果camera.createCaptureSession這段代碼很重要,創(chuàng)建會話 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調(diào)用.net webservice
jQuery教程(8)-DOM樹操作之應(yīng)用反向插入辦法
android進(jìn)修標(biāo)記(34)應(yīng)用AlertDialog創(chuàng)建簡單對話框
android進(jìn)修標(biāo)記(33)畫廊視圖(Gallery)的功能和用法
android navidgation drawer 在導(dǎo)航抽屜中若何改變List選中項(xiàng)的...
更多關(guān)于android開辟文┞仿
相關(guān)案例查看更多
相關(guān)閱讀
- 汽車報(bào)廢回收管理系統(tǒng)
- 保山小程序開發(fā)
- 云南軟件設(shè)計(jì)
- 云南etc微信小程序
- 小程序開發(fā)聯(lián)系方式
- 江蘇小程序開發(fā)
- 小程序
- 云南網(wǎng)站開發(fā)
- 云南做軟件
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 百度小程序公司
- 昆明做網(wǎng)站建設(shè)的公司排名
- 小程序用戶登錄
- 昆明小程序公司
- 云南小程序代建
- painter
- 網(wǎng)站建設(shè)哪家強(qiáng)
- 云南軟件定制
- 北京小程序制作
- 云南小程序開發(fā)公司
- 汽車報(bào)廢管理
- 網(wǎng)站建設(shè)首選
- 曲靖小程序開發(fā)
- 開通微信小程序被騙
- 網(wǎng)絡(luò)公司
- 云南網(wǎng)站建設(shè)哪家公司好
- 楚雄小程序開發(fā)
- 云南網(wǎng)站建設(shè)首選公司
- 報(bào)廢車回收管理軟件
- 昆明網(wǎng)站開發(fā)