SlideShare a Scribd company logo
1 of 35
Download to read offline
Building Native Camera Access - Part I
Introduction
© Codename One 2017 all rights reserved
✦Low level camera access has been a long time “wish
list” item
✦First Step: Survey Existing Solutions
✦Existing platforms don’t have something close
✦Camera Kit Android stood out as the best/simplest
option

https://github.com/CameraKit/camerakit-android/
Process
© Codename One 2017 all rights reserved
✦I went with the Android API “As Is”
✦Camera Kit Android already did the hard work of “design”
✦I started with an app that uses native interfaces, not a
cn1lib
✦API is mostly based on CameraView:

https://github.com/CameraKit/camerakit-android/blob/
master/camerakit-core/src/main/java/com/wonderkiln/
camerakit/CameraView.java
public interface CameraNativeAccess extends NativeInterface {
PeerComponent getView();
boolean isStarted();
void start();
void stop();
float getVerticalViewingAngle();
float getHorizontalViewingAngle();
int getFacing();
boolean isFacingFront();
boolean isFacingBack();
void setFacing(int facing);
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
CameraNativeAccess
public interface CameraNativeAccess extends NativeInterface {
PeerComponent getView();
boolean isStarted();
void start();
void stop();
float getVerticalViewingAngle();
float getHorizontalViewingAngle();
int getFacing();
boolean isFacingFront();
boolean isFacingBack();
void setFacing(int facing);
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
CameraNativeAccess
public interface CameraNativeAccess extends NativeInterface {
PeerComponent getView();
boolean isStarted();
void start();
void stop();
float getVerticalViewingAngle();
float getHorizontalViewingAngle();
int getFacing();
boolean isFacingFront();
boolean isFacingBack();
void setFacing(int facing);
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
CameraNativeAccess
public interface CameraNativeAccess extends NativeInterface {
PeerComponent getView();
boolean isStarted();
void start();
void stop();
float getVerticalViewingAngle();
float getHorizontalViewingAngle();
int getFacing();
boolean isFacingFront();
boolean isFacingBack();
void setFacing(int facing);
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
CameraNativeAccess
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
void setJpegQuality(int jpegQuality);
void setCropOutput(boolean cropOutput);
void captureImage();
void captureVideo();
void captureVideoFile(String videoFile);
void stopVideo();
int getPreviewWidth();
int getPreviewHeight();
int getCaptureWidth();
int getCaptureHeight();
}
CameraNativeAccess
void setFlash(int flash);
int toggleFacing();
int toggleFlash();
int getFlash();
void setFocus(int focus);
void setMethod(int method);
void setPinchToZoom(boolean zoom);
void setZoom(float zoom);
void setPermissions(int permissions);
void setVideoQuality(int videoQuality);
void setVideoBitRate(int videoBitRate);
void setLockVideoAspectRatio(boolean lockVideoAspectRatio);
void setJpegQuality(int jpegQuality);
void setCropOutput(boolean cropOutput);
void captureImage();
void captureVideo();
void captureVideoFile(String videoFile);
void stopVideo();
int getPreviewWidth();
int getPreviewHeight();
int getCaptureWidth();
int getCaptureHeight();
}
CameraNativeAccess
public boolean setTextDetectionListener(
CameraKitEventCallback<CameraKitTextDetect> callback);
public void captureImage(CameraKitEventCallback<CameraKitImage> callback);
public void captureVideo(CameraKitEventCallback<CameraKitVideo> callback);
public void captureVideo(File videoFile,
CameraKitEventCallback<CameraKitVideo> callback);
public void addCameraKitListener(
CameraKitEventListener CameraKitEventListener);
public void bindCameraKitListener(Object object);
Missing from the Native Interface
public interface Constants {
public static final int PERMISSION_REQUEST_CAMERA = 16;
public static final int FACING_BACK = 0;
public static final int FACING_FRONT = 1;
public static final int FLASH_OFF = 0;
public static final int FLASH_ON = 1;
public static final int FLASH_AUTO = 2;
public static final int FLASH_TORCH = 3;
public static final int FOCUS_OFF = 0;
public static final int FOCUS_CONTINUOUS = 1;
public static final int FOCUS_TAP = 2;
public static final int FOCUS_TAP_WITH_MARKER = 3;
public static final int METHOD_STANDARD = 0;
public static final int METHOD_STILL = 1;
public static final int PERMISSIONS_STRICT = 0;
public static final int PERMISSIONS_LAZY = 1;
public static final int PERMISSIONS_PICTURE = 2;
public static final int VIDEO_QUALITY_480P = 0;
public static final int VIDEO_QUALITY_720P = 1;
public static final int VIDEO_QUALITY_1080P = 2;
public static final int VIDEO_QUALITY_2160P = 3;
public static final int VIDEO_QUALITY_HIGHEST = 4;
public static final int VIDEO_QUALITY_LOWEST = 5;
public static final int VIDEO_QUALITY_QVGA = 6;
}
Constants
High Level Abstraction
© Codename One 2017 all rights reserved
✦Never expose a native interface to a user
✦Always wrap the native interface in a regular class
✦This lets you change the native API
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public class CameraKit implements Constants {
private CameraNativeAccess cma;
private static CameraKit instance;
private ArrayList<CameraListener> listeners = new ArrayList<>();
static boolean thisIsForIOS;
private static void initBuildHint() {
Map<String, String> buildHints = Display.getInstance().
getProjectBuildHints();
if(!buildHints.containsKey("ios.NSCameraUsageDescription")) {
Display.getInstance().setProjectBuildHint(
"ios.NSCameraUsageDescription",
"We need camera access to grab pictures and videos");
}
}
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
CameraKit
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
if(thisIsForIOS) {
CameraCallbacks.onError(null, null, null);
CameraCallbacks.onImage(null);
CameraCallbacks.onVideo(null);
}
return null;
}
instance = new CameraKit();
instance.cma =
NativeLookup.create(CameraNativeAccess.class);
if(instance.cma != null && instance.cma.isSupported()) {
return instance;
}
instance = null;
CameraKit
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
if(thisIsForIOS) {
CameraCallbacks.onError(null, null, null);
CameraCallbacks.onImage(null);
CameraCallbacks.onVideo(null);
}
return null;
}
instance = new CameraKit();
instance.cma =
NativeLookup.create(CameraNativeAccess.class);
if(instance.cma != null && instance.cma.isSupported()) {
return instance;
}
instance = null;
CameraKit
public static CameraKit create() {
if(instance == null) {
if(isSimulator()) {
initBuildHint();
if(thisIsForIOS) {
CameraCallbacks.onError(null, null, null);
CameraCallbacks.onImage(null);
CameraCallbacks.onVideo(null);
}
return null;
}
instance = new CameraKit();
instance.cma =
NativeLookup.create(CameraNativeAccess.class);
if(instance.cma != null && instance.cma.isSupported()) {
return instance;
}
instance = null;
CameraKit
initBuildHint();
if(thisIsForIOS) {
CameraCallbacks.onError(null, null, null);
CameraCallbacks.onImage(null);
CameraCallbacks.onVideo(null);
}
return null;
}
instance = new CameraKit();
instance.cma =
NativeLookup.create(CameraNativeAccess.class);
if(instance.cma != null && instance.cma.isSupported()) {
return instance;
}
instance = null;
}
return instance;
}
CameraKit
public PeerComponent getView() {
return cma.getView();
}
public boolean isStarted() {
return cma.isStarted();
}
public void start() {
cma.start();
}
public void stop() {
cma.stop();
}
CameraKit
public int toggleFacing() {
if(getFacing() == FACING_BACK) {
setFacing(FACING_FRONT);
return FACING_FRONT;
}
setFacing(FACING_BACK);
return FACING_BACK;
}
public int toggleFlash() {
switch (getFlash()) {
case FLASH_OFF:
setFlash(FLASH_ON);
break;
case FLASH_ON:
setFlash(FLASH_AUTO);
break;
case FLASH_AUTO:
case FLASH_TORCH:
setFlash(FLASH_OFF);
break;
}
return getFlash();
}
CameraKit
public int toggleFacing() {
if(getFacing() == FACING_BACK) {
setFacing(FACING_FRONT);
return FACING_FRONT;
}
setFacing(FACING_BACK);
return FACING_BACK;
}
public int toggleFlash() {
switch (getFlash()) {
case FLASH_OFF:
setFlash(FLASH_ON);
break;
case FLASH_ON:
setFlash(FLASH_AUTO);
break;
case FLASH_AUTO:
case FLASH_TORCH:
setFlash(FLASH_OFF);
break;
}
return getFlash();
}
CameraKit
public void addCameraListener(CameraListener listener) { listeners.add(listener); }
public void removeCameraListener(CameraListener listener) { listeners.remove(listener); }
public void fireCameraErrorEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraErrorEvent(ev));
return;
}
for(CameraListener l : listeners) {
l.onError(ev);
}
}
public void fireCameraImageEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraImageEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onImage(ev); }
}
public void fireCameraVideoEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraVideoEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onVideo(ev); }
}
CameraKit
public void addCameraListener(CameraListener listener) { listeners.add(listener); }
public void removeCameraListener(CameraListener listener) { listeners.remove(listener); }
public void fireCameraErrorEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraErrorEvent(ev));
return;
}
for(CameraListener l : listeners) {
l.onError(ev);
}
}
public void fireCameraImageEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraImageEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onImage(ev); }
}
public void fireCameraVideoEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraVideoEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onVideo(ev); }
}
CameraKit
public void addCameraListener(CameraListener listener) { listeners.add(listener); }
public void removeCameraListener(CameraListener listener) { listeners.remove(listener); }
public void fireCameraErrorEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraErrorEvent(ev));
return;
}
for(CameraListener l : listeners) {
l.onError(ev);
}
}
public void fireCameraImageEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraImageEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onImage(ev); }
}
public void fireCameraVideoEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraVideoEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onVideo(ev); }
}
CameraKit
public void addCameraListener(CameraListener listener) { listeners.add(listener); }
public void removeCameraListener(CameraListener listener) { listeners.remove(listener); }
public void fireCameraErrorEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraErrorEvent(ev));
return;
}
for(CameraListener l : listeners) {
l.onError(ev);
}
}
public void fireCameraImageEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraImageEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onImage(ev); }
}
public void fireCameraVideoEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraVideoEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onVideo(ev); }
}
CameraKit
public void addCameraListener(CameraListener listener) { listeners.add(listener); }
public void removeCameraListener(CameraListener listener) { listeners.remove(listener); }
public void fireCameraErrorEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraErrorEvent(ev));
return;
}
for(CameraListener l : listeners) {
l.onError(ev);
}
}
public void fireCameraImageEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraImageEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onImage(ev); }
}
public void fireCameraVideoEvent(final CameraEvent ev) {
if(!isEdt()) {
callSerially(() -> fireCameraVideoEvent(ev));
return;
}
for(CameraListener l : listeners) { l.onVideo(ev); }
}
CameraKit
public class CameraCallbacks {
public static void onError(String type, String message,
String exceptionMessage) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraErrorEvent(
new CameraEvent(type, message, exceptionMessage));
}
}
public static void onImage(byte[] jpeg) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraImageEvent(new CameraEvent(jpeg));
}
}
public static void onVideo(String file) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraVideoEvent(new CameraEvent(file));
}
}
}
CameraCallbacks
public class CameraCallbacks {
public static void onError(String type, String message,
String exceptionMessage) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraErrorEvent(
new CameraEvent(type, message, exceptionMessage));
}
}
public static void onImage(byte[] jpeg) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraImageEvent(new CameraEvent(jpeg));
}
}
public static void onVideo(String file) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraVideoEvent(new CameraEvent(file));
}
}
}
CameraCallbacks
public class CameraCallbacks {
public static void onError(String type, String message,
String exceptionMessage) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraErrorEvent(
new CameraEvent(type, message, exceptionMessage));
}
}
public static void onImage(byte[] jpeg) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraImageEvent(new CameraEvent(jpeg));
}
}
public static void onVideo(String file) {
CameraKit ck = CameraKit.create();
if(ck != null) {
ck.fireCameraVideoEvent(new CameraEvent(file));
}
}
}
CameraCallbacks

More Related Content

Similar to Building a Native Camera Access Library - Part I.pdf

Similar to Building a Native Camera Access Library - Part I.pdf (20)

Building a Native Camera Access Library - Part II - Transcript.pdf
Building a Native Camera Access Library - Part II - Transcript.pdfBuilding a Native Camera Access Library - Part II - Transcript.pdf
Building a Native Camera Access Library - Part II - Transcript.pdf
 
iOS Training Session-3
iOS Training Session-3iOS Training Session-3
iOS Training Session-3
 
Building a Native Camera Access Library - Part IV - Transcript.pdf
Building a Native Camera Access Library - Part IV - Transcript.pdfBuilding a Native Camera Access Library - Part IV - Transcript.pdf
Building a Native Camera Access Library - Part IV - Transcript.pdf
 
Vue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapyVue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapy
 
MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)MobileConf 2015: Desmistificando o Phonegap (Cordova)
MobileConf 2015: Desmistificando o Phonegap (Cordova)
 
Clean code via dependency injection + guice
Clean code via dependency injection + guiceClean code via dependency injection + guice
Clean code via dependency injection + guice
 
Desmistificando o Phonegap (Cordova)
Desmistificando o Phonegap (Cordova)Desmistificando o Phonegap (Cordova)
Desmistificando o Phonegap (Cordova)
 
How to implement camera recording for USB webcam or IP camera in C#.NET
How to implement camera recording for USB webcam or IP camera in C#.NETHow to implement camera recording for USB webcam or IP camera in C#.NET
How to implement camera recording for USB webcam or IP camera in C#.NET
 
Web Standards for AR workshop at ISMAR13
Web Standards for AR workshop at ISMAR13Web Standards for AR workshop at ISMAR13
Web Standards for AR workshop at ISMAR13
 
Moustamera
MoustameraMoustamera
Moustamera
 
Creating a Facebook Clone - Part XLIII - Transcript.pdf
Creating a Facebook Clone - Part XLIII - Transcript.pdfCreating a Facebook Clone - Part XLIII - Transcript.pdf
Creating a Facebook Clone - Part XLIII - Transcript.pdf
 
iphonedevcon 2010: Cooking with iAd
iphonedevcon 2010:  Cooking with iAd iphonedevcon 2010:  Cooking with iAd
iphonedevcon 2010: Cooking with iAd
 
Cqs v2
Cqs v2Cqs v2
Cqs v2
 
Mopcon2017 - AppDevKit x CameraKit
Mopcon2017 - AppDevKit x CameraKitMopcon2017 - AppDevKit x CameraKit
Mopcon2017 - AppDevKit x CameraKit
 
Augmented Reality in JavaScript
Augmented Reality in JavaScriptAugmented Reality in JavaScript
Augmented Reality in JavaScript
 
MNT2014: Mobile Hibrido com Phonegap
MNT2014: Mobile Hibrido com PhonegapMNT2014: Mobile Hibrido com Phonegap
MNT2014: Mobile Hibrido com Phonegap
 
Introduction of Android Camera1
Introduction of Android Camera1Introduction of Android Camera1
Introduction of Android Camera1
 
Exploring CameraX from JetPack
Exploring CameraX from JetPackExploring CameraX from JetPack
Exploring CameraX from JetPack
 
Android camera2
Android camera2Android camera2
Android camera2
 
CQS
CQSCQS
CQS
 

More from ShaiAlmog1

More from ShaiAlmog1 (20)

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdf
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdf
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdf
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdf
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdf
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdf
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdf
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdf
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdf
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdf
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Recently uploaded (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 

Building a Native Camera Access Library - Part I.pdf

  • 1. Building Native Camera Access - Part I
  • 2. Introduction © Codename One 2017 all rights reserved ✦Low level camera access has been a long time “wish list” item ✦First Step: Survey Existing Solutions ✦Existing platforms don’t have something close ✦Camera Kit Android stood out as the best/simplest option
 https://github.com/CameraKit/camerakit-android/
  • 3. Process © Codename One 2017 all rights reserved ✦I went with the Android API “As Is” ✦Camera Kit Android already did the hard work of “design” ✦I started with an app that uses native interfaces, not a cn1lib ✦API is mostly based on CameraView:
 https://github.com/CameraKit/camerakit-android/blob/ master/camerakit-core/src/main/java/com/wonderkiln/ camerakit/CameraView.java
  • 4. public interface CameraNativeAccess extends NativeInterface { PeerComponent getView(); boolean isStarted(); void start(); void stop(); float getVerticalViewingAngle(); float getHorizontalViewingAngle(); int getFacing(); boolean isFacingFront(); boolean isFacingBack(); void setFacing(int facing); void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); CameraNativeAccess
  • 5. public interface CameraNativeAccess extends NativeInterface { PeerComponent getView(); boolean isStarted(); void start(); void stop(); float getVerticalViewingAngle(); float getHorizontalViewingAngle(); int getFacing(); boolean isFacingFront(); boolean isFacingBack(); void setFacing(int facing); void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); CameraNativeAccess
  • 6. public interface CameraNativeAccess extends NativeInterface { PeerComponent getView(); boolean isStarted(); void start(); void stop(); float getVerticalViewingAngle(); float getHorizontalViewingAngle(); int getFacing(); boolean isFacingFront(); boolean isFacingBack(); void setFacing(int facing); void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); CameraNativeAccess
  • 7. public interface CameraNativeAccess extends NativeInterface { PeerComponent getView(); boolean isStarted(); void start(); void stop(); float getVerticalViewingAngle(); float getHorizontalViewingAngle(); int getFacing(); boolean isFacingFront(); boolean isFacingBack(); void setFacing(int facing); void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); CameraNativeAccess
  • 8. void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); void setJpegQuality(int jpegQuality); void setCropOutput(boolean cropOutput); void captureImage(); void captureVideo(); void captureVideoFile(String videoFile); void stopVideo(); int getPreviewWidth(); int getPreviewHeight(); int getCaptureWidth(); int getCaptureHeight(); } CameraNativeAccess
  • 9. void setFlash(int flash); int toggleFacing(); int toggleFlash(); int getFlash(); void setFocus(int focus); void setMethod(int method); void setPinchToZoom(boolean zoom); void setZoom(float zoom); void setPermissions(int permissions); void setVideoQuality(int videoQuality); void setVideoBitRate(int videoBitRate); void setLockVideoAspectRatio(boolean lockVideoAspectRatio); void setJpegQuality(int jpegQuality); void setCropOutput(boolean cropOutput); void captureImage(); void captureVideo(); void captureVideoFile(String videoFile); void stopVideo(); int getPreviewWidth(); int getPreviewHeight(); int getCaptureWidth(); int getCaptureHeight(); } CameraNativeAccess
  • 10. public boolean setTextDetectionListener( CameraKitEventCallback<CameraKitTextDetect> callback); public void captureImage(CameraKitEventCallback<CameraKitImage> callback); public void captureVideo(CameraKitEventCallback<CameraKitVideo> callback); public void captureVideo(File videoFile, CameraKitEventCallback<CameraKitVideo> callback); public void addCameraKitListener( CameraKitEventListener CameraKitEventListener); public void bindCameraKitListener(Object object); Missing from the Native Interface
  • 11. public interface Constants { public static final int PERMISSION_REQUEST_CAMERA = 16; public static final int FACING_BACK = 0; public static final int FACING_FRONT = 1; public static final int FLASH_OFF = 0; public static final int FLASH_ON = 1; public static final int FLASH_AUTO = 2; public static final int FLASH_TORCH = 3; public static final int FOCUS_OFF = 0; public static final int FOCUS_CONTINUOUS = 1; public static final int FOCUS_TAP = 2; public static final int FOCUS_TAP_WITH_MARKER = 3; public static final int METHOD_STANDARD = 0; public static final int METHOD_STILL = 1; public static final int PERMISSIONS_STRICT = 0; public static final int PERMISSIONS_LAZY = 1; public static final int PERMISSIONS_PICTURE = 2; public static final int VIDEO_QUALITY_480P = 0; public static final int VIDEO_QUALITY_720P = 1; public static final int VIDEO_QUALITY_1080P = 2; public static final int VIDEO_QUALITY_2160P = 3; public static final int VIDEO_QUALITY_HIGHEST = 4; public static final int VIDEO_QUALITY_LOWEST = 5; public static final int VIDEO_QUALITY_QVGA = 6; } Constants
  • 12. High Level Abstraction © Codename One 2017 all rights reserved ✦Never expose a native interface to a user ✦Always wrap the native interface in a regular class ✦This lets you change the native API
  • 13. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 14. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 15. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 16. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 17. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 18. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 19. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 20. public class CameraKit implements Constants { private CameraNativeAccess cma; private static CameraKit instance; private ArrayList<CameraListener> listeners = new ArrayList<>(); static boolean thisIsForIOS; private static void initBuildHint() { Map<String, String> buildHints = Display.getInstance(). getProjectBuildHints(); if(!buildHints.containsKey("ios.NSCameraUsageDescription")) { Display.getInstance().setProjectBuildHint( "ios.NSCameraUsageDescription", "We need camera access to grab pictures and videos"); } } public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); CameraKit
  • 21. public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); if(thisIsForIOS) { CameraCallbacks.onError(null, null, null); CameraCallbacks.onImage(null); CameraCallbacks.onVideo(null); } return null; } instance = new CameraKit(); instance.cma = NativeLookup.create(CameraNativeAccess.class); if(instance.cma != null && instance.cma.isSupported()) { return instance; } instance = null; CameraKit
  • 22. public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); if(thisIsForIOS) { CameraCallbacks.onError(null, null, null); CameraCallbacks.onImage(null); CameraCallbacks.onVideo(null); } return null; } instance = new CameraKit(); instance.cma = NativeLookup.create(CameraNativeAccess.class); if(instance.cma != null && instance.cma.isSupported()) { return instance; } instance = null; CameraKit
  • 23. public static CameraKit create() { if(instance == null) { if(isSimulator()) { initBuildHint(); if(thisIsForIOS) { CameraCallbacks.onError(null, null, null); CameraCallbacks.onImage(null); CameraCallbacks.onVideo(null); } return null; } instance = new CameraKit(); instance.cma = NativeLookup.create(CameraNativeAccess.class); if(instance.cma != null && instance.cma.isSupported()) { return instance; } instance = null; CameraKit
  • 24. initBuildHint(); if(thisIsForIOS) { CameraCallbacks.onError(null, null, null); CameraCallbacks.onImage(null); CameraCallbacks.onVideo(null); } return null; } instance = new CameraKit(); instance.cma = NativeLookup.create(CameraNativeAccess.class); if(instance.cma != null && instance.cma.isSupported()) { return instance; } instance = null; } return instance; } CameraKit
  • 25. public PeerComponent getView() { return cma.getView(); } public boolean isStarted() { return cma.isStarted(); } public void start() { cma.start(); } public void stop() { cma.stop(); } CameraKit
  • 26. public int toggleFacing() { if(getFacing() == FACING_BACK) { setFacing(FACING_FRONT); return FACING_FRONT; } setFacing(FACING_BACK); return FACING_BACK; } public int toggleFlash() { switch (getFlash()) { case FLASH_OFF: setFlash(FLASH_ON); break; case FLASH_ON: setFlash(FLASH_AUTO); break; case FLASH_AUTO: case FLASH_TORCH: setFlash(FLASH_OFF); break; } return getFlash(); } CameraKit
  • 27. public int toggleFacing() { if(getFacing() == FACING_BACK) { setFacing(FACING_FRONT); return FACING_FRONT; } setFacing(FACING_BACK); return FACING_BACK; } public int toggleFlash() { switch (getFlash()) { case FLASH_OFF: setFlash(FLASH_ON); break; case FLASH_ON: setFlash(FLASH_AUTO); break; case FLASH_AUTO: case FLASH_TORCH: setFlash(FLASH_OFF); break; } return getFlash(); } CameraKit
  • 28. public void addCameraListener(CameraListener listener) { listeners.add(listener); } public void removeCameraListener(CameraListener listener) { listeners.remove(listener); } public void fireCameraErrorEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraErrorEvent(ev)); return; } for(CameraListener l : listeners) { l.onError(ev); } } public void fireCameraImageEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraImageEvent(ev)); return; } for(CameraListener l : listeners) { l.onImage(ev); } } public void fireCameraVideoEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraVideoEvent(ev)); return; } for(CameraListener l : listeners) { l.onVideo(ev); } } CameraKit
  • 29. public void addCameraListener(CameraListener listener) { listeners.add(listener); } public void removeCameraListener(CameraListener listener) { listeners.remove(listener); } public void fireCameraErrorEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraErrorEvent(ev)); return; } for(CameraListener l : listeners) { l.onError(ev); } } public void fireCameraImageEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraImageEvent(ev)); return; } for(CameraListener l : listeners) { l.onImage(ev); } } public void fireCameraVideoEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraVideoEvent(ev)); return; } for(CameraListener l : listeners) { l.onVideo(ev); } } CameraKit
  • 30. public void addCameraListener(CameraListener listener) { listeners.add(listener); } public void removeCameraListener(CameraListener listener) { listeners.remove(listener); } public void fireCameraErrorEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraErrorEvent(ev)); return; } for(CameraListener l : listeners) { l.onError(ev); } } public void fireCameraImageEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraImageEvent(ev)); return; } for(CameraListener l : listeners) { l.onImage(ev); } } public void fireCameraVideoEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraVideoEvent(ev)); return; } for(CameraListener l : listeners) { l.onVideo(ev); } } CameraKit
  • 31. public void addCameraListener(CameraListener listener) { listeners.add(listener); } public void removeCameraListener(CameraListener listener) { listeners.remove(listener); } public void fireCameraErrorEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraErrorEvent(ev)); return; } for(CameraListener l : listeners) { l.onError(ev); } } public void fireCameraImageEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraImageEvent(ev)); return; } for(CameraListener l : listeners) { l.onImage(ev); } } public void fireCameraVideoEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraVideoEvent(ev)); return; } for(CameraListener l : listeners) { l.onVideo(ev); } } CameraKit
  • 32. public void addCameraListener(CameraListener listener) { listeners.add(listener); } public void removeCameraListener(CameraListener listener) { listeners.remove(listener); } public void fireCameraErrorEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraErrorEvent(ev)); return; } for(CameraListener l : listeners) { l.onError(ev); } } public void fireCameraImageEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraImageEvent(ev)); return; } for(CameraListener l : listeners) { l.onImage(ev); } } public void fireCameraVideoEvent(final CameraEvent ev) { if(!isEdt()) { callSerially(() -> fireCameraVideoEvent(ev)); return; } for(CameraListener l : listeners) { l.onVideo(ev); } } CameraKit
  • 33. public class CameraCallbacks { public static void onError(String type, String message, String exceptionMessage) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraErrorEvent( new CameraEvent(type, message, exceptionMessage)); } } public static void onImage(byte[] jpeg) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraImageEvent(new CameraEvent(jpeg)); } } public static void onVideo(String file) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraVideoEvent(new CameraEvent(file)); } } } CameraCallbacks
  • 34. public class CameraCallbacks { public static void onError(String type, String message, String exceptionMessage) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraErrorEvent( new CameraEvent(type, message, exceptionMessage)); } } public static void onImage(byte[] jpeg) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraImageEvent(new CameraEvent(jpeg)); } } public static void onVideo(String file) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraVideoEvent(new CameraEvent(file)); } } } CameraCallbacks
  • 35. public class CameraCallbacks { public static void onError(String type, String message, String exceptionMessage) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraErrorEvent( new CameraEvent(type, message, exceptionMessage)); } } public static void onImage(byte[] jpeg) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraImageEvent(new CameraEvent(jpeg)); } } public static void onVideo(String file) { CameraKit ck = CameraKit.create(); if(ck != null) { ck.fireCameraVideoEvent(new CameraEvent(file)); } } } CameraCallbacks