Image
6.4.2016 0 Comments

Seriál: Programujeme pre Android – Camera2 API

V dnešnej časti seriálu sa začneme venovať práci s kamerou, konkrétne tzv. Camera2 API, ktoré bolo uvedené s príchodom Android 5.0 Lollipop – API Level 21. Ide o pomerne nové rozhranie a preto nie je podporované každým zariadením. Oproti pôvodnému Camera API však poskytuje množstvo výhod a je odporúčaným rozhraním pre vývoj nových aplikácií.

Zastaralé, resp. neaktuálne (deprecated) rozhranie Camera API je síce stále možné využiť, avšak s istými obmedzeniami ako napr. obmedzený prístup k tzv. streamom, k informáciám o stave kamery, ku kontrole snímkovania… Nové API je modernejšie, výkonnejšie a zahŕňa rozšírené nastavenia kamery vrátane tzv. RAW snímkovania.

Súčasti Camera2 API

Najmarkantnejším rozdielom nového rozhrania oproti pôvodnému je rozdelenie úloh medzi šesť základných súčastí (module parts):

1 CameraManager Systémová služba (CAMERA_SERVICE) určená na pripojenie ku CameraDevice
2 CameraDevice Softvérová reprezentácia hardvérových zariadení – kamier
3 CameraCharacteristics Kamery integrované v zariadeniach majú rozdielne vlastnosti, resp. poskytujú rôzne možnosti (features), ktoré sú odstupňované v tzv. úrovniach (levels):
FULL – vysoké rozlíšenie s tzv. burst módom, plná kontrola
LIMITED – absentujú niektoré vlastnosti FULL úrovne
LEGACY – úroveň totožná s pôvodným Camera API
4 CameraCaptureSession Relácia (session) určená na tvorbu snímok – smerovanie výstupu na určenú skupinu plôch (surfaces)
5 CaptureRequest Parametre potrebné na vytvorenie snímky (obrázku), resp. v prípade setRepeatingRequest na vytvorenie skupiny snímok (na vytvorenie požiadavky je vhodné využiť abstraktnú metódu CaptureRequest.Builder triedy CameraDevice)
6 CaptureResult Jednotlivá snímka (obrázok) vytvorená (zosnímaná) kamerou

Diferencia rozhraní

Napriek faktu, že vývojový tím Androidu jednoznačne odporúča používať Camera2 API, mnoho zariadení ho stále nepodporuje. Aby sme tieto zariadenia (API 1-20) neukrátili o možnosť využívať vstavané kamery, môžeme do nášho kódu implementovať oba prístupy napr. takto:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

  // implementácia pomocou Camera API (verzie 1-20)

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

  // implementácia pomocou Camera2 API (verzie 21 a vyššie)

}

Konkrétna implementácia pomocou Camera API je pomerne jednoduchá a „priamočiara“. My sa zameriame na druhý, zložitejší, avšak účelovejší spôsob práce s kamerou.

Používame Camera2 API

Modul android.hardware.camera2 vytvára prostredníctvom svojich tried tzv. prúd (pipeline), ktorým spracováva obraz snímaný kamerou. Jeho použitie, takisto ako aj povolenie používania kamery, musíme ako zvyčajne zahrnúť do manifestu aplikácie:

Ďalšiu prácu s kamerou rozčleníme do šiestich blokov, ktoré umiestnime do spoločnej triedy:

1. pripravíme TextureView objekt, do ktorého bude smerovaný výstup z kamery, v rámci jeho metódy onSurfaceTextureAvailable() vytvoríme nové spojenie (connection) s kamerou:

TextureView.SurfaceTextureListener(mListener);

mListener.onSurfaceTextureAvailable() {

  openCamera();

}

2. v druhom kroku získame inštanciu triedy CameraManager, načítame vlastnosti kamery a kameru sprístupníme pomocou metódy CameraManager.openCamera():

openCamera() {

  CameraManager mManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

  ...

  CameraCharacteristics mCharacteristics = mManager.getCameraCharacteristics(camId);

  ...

  mManager.openCamera(camId, mStateCallback, null);

}

3. implementujeme tzv. callback triedu, ktorú sme použili na sprístupnenie kamery; StateCallback je určená na získavanie aktualizovaných stavov kamery pričom v našom prípade upravíme jej abstraktnú metódu onOpened():

CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {

  onOpened(CameraDevice camera) {

    startPreview();

  }

}

4. sprístupníme plochu SurfaceTexture -> Surface, do ktorej bude smerovaný výstup z kamery a vytvoríme požiadavku createCaptureRequest() s využitím preddefinovaného vzoru (template); výstup na konkrétnu plochu môžeme upraviť pomocou príslušných transformácií – týka sa napr. zväčšenia, posunu, otočenia...

5. v predposlednom kroku vytvoríme reláciu createCaptureSession() určenú na tvorbu snímok s určením plôch, na ktoré má smerovať výstup z kamery, podobne ako v prípade CameraDevice implementujeme callback triedu a jej abstraktnú metódu onConfigured():

startPreview() {

  SurfaceTexture texture = TextureView.getSurfaceTexture();

  Surface surface = new Surface(texture);

  ...

  mPreviewBuilder = CameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

  mPreviewBuilder.addTarget(surface);

  ...

  CameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {

    onConfigured(CameraCaptureSession session) {

      mPreviewSession = session;

      updatePreview();

    }

  }

}

6. nakoniec vytvoríme samostatné vlákno (thread) obsahujúce tzv. Looper (MessageQueue) a zašleme požiadavku na príjem nekonečného sledu snímok z kamery prostredníctvom setRepeatingRequest():

updatePreview() {

  mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);

  HandlerThread thread = new HandlerThread("CameraPreview");

  thread.start();

  Handler backgroundHandler = new Handler(thread.getLooper());

  mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);

}

Po skončení používania kamery je vhodné kameru „uvolniť“ na ďalšie použitie iným systémovým procesom pomocou metódy CameraDevice.close();

 

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá