commit
843b432d56
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
This plugin integrates with the [ZBar](http://zbar.sourceforge.net/) library,
|
This plugin integrates with the [ZBar](http://zbar.sourceforge.net/) library,
|
||||||
exposing a JavaScript interface for scanning barcodes (QR, 2D, etc).
|
exposing a JavaScript interface for scanning barcodes (QR, 2D, etc).
|
||||||
|
In this fork a button has been added to turn off and on device flash. In addition the plugin can now handle the device orientation change.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -5,15 +5,20 @@ import java.lang.RuntimeException;
|
|||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
import android.hardware.Camera.CameraInfo;
|
import android.hardware.Camera.CameraInfo;
|
||||||
|
import android.hardware.Camera.Parameters;
|
||||||
import android.hardware.Camera.PreviewCallback;
|
import android.hardware.Camera.PreviewCallback;
|
||||||
import android.hardware.Camera.AutoFocusCallback;
|
import android.hardware.Camera.AutoFocusCallback;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.support.v4.app.ActivityCompat;
|
||||||
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
@ -22,6 +27,9 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.view.Surface;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -43,14 +51,14 @@ implements SurfaceHolder.Callback {
|
|||||||
|
|
||||||
// Config ----------------------------------------------------------
|
// Config ----------------------------------------------------------
|
||||||
|
|
||||||
private static int autoFocusInterval = 500; // Interval between AFcallback and next AF attempt.
|
private static int autoFocusInterval = 2000; // Interval between AFcallback and next AF attempt.
|
||||||
|
|
||||||
// Public Constants ------------------------------------------------
|
// Public Constants ------------------------------------------------
|
||||||
|
|
||||||
public static final String EXTRA_QRVALUE = "qrValue";
|
public static final String EXTRA_QRVALUE = "qrValue";
|
||||||
public static final String EXTRA_PARAMS = "params";
|
public static final String EXTRA_PARAMS = "params";
|
||||||
public static final int RESULT_ERROR = RESULT_FIRST_USER + 1;
|
public static final int RESULT_ERROR = RESULT_FIRST_USER + 1;
|
||||||
|
private static final int CAMERA_PERMISSION_REQUEST = 1;
|
||||||
// State -----------------------------------------------------------
|
// State -----------------------------------------------------------
|
||||||
|
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
@ -80,10 +88,47 @@ implements SurfaceHolder.Callback {
|
|||||||
// Activity Lifecycle ----------------------------------------------
|
// Activity Lifecycle ----------------------------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate (Bundle savedInstanceState)
|
public void onCreate (Bundle savedInstanceState) {
|
||||||
{
|
|
||||||
|
|
||||||
|
int permissionCheck = ContextCompat.checkSelfPermission(this.getBaseContext(), Manifest.permission.CAMERA);
|
||||||
|
|
||||||
|
if(permissionCheck == PackageManager.PERMISSION_GRANTED){
|
||||||
|
|
||||||
|
setUpCamera();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
ActivityCompat.requestPermissions(this,
|
||||||
|
new String[]{Manifest.permission.CAMERA},
|
||||||
|
CAMERA_PERMISSION_REQUEST);
|
||||||
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public void onRequestPermissionsResult(int requestCode,
|
||||||
|
String permissions[], int[] grantResults) {
|
||||||
|
switch (requestCode) {
|
||||||
|
case CAMERA_PERMISSION_REQUEST: {
|
||||||
|
if (grantResults.length > 0
|
||||||
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
setUpCamera();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
onBackPressed();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// other 'case' lines to check for other
|
||||||
|
// permissions this app might request
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void setUpCamera() {
|
||||||
|
// If request is cancelled, the result arrays are empty.
|
||||||
|
|
||||||
|
|
||||||
// Get parameters from JS
|
// Get parameters from JS
|
||||||
Intent startIntent = getIntent();
|
Intent startIntent = getIntent();
|
||||||
String paramStr = startIntent.getStringExtra(EXTRA_PARAMS);
|
String paramStr = startIntent.getStringExtra(EXTRA_PARAMS);
|
||||||
@ -147,6 +192,7 @@ implements SurfaceHolder.Callback {
|
|||||||
findViewById(getResourceId("id/csZbarScannerSight")).bringToFront();
|
findViewById(getResourceId("id/csZbarScannerSight")).bringToFront();
|
||||||
scannerView.requestLayout();
|
scannerView.requestLayout();
|
||||||
scannerView.invalidate();
|
scannerView.invalidate();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -170,33 +216,36 @@ implements SurfaceHolder.Callback {
|
|||||||
|
|
||||||
if(camera == null) throw new Exception ("Error: No suitable camera found.");
|
if(camera == null) throw new Exception ("Error: No suitable camera found.");
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
die("Error: Could not open the camera.");
|
//die("Error: Could not open the camera.");
|
||||||
return;
|
return;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
die(e.getMessage());
|
// die(e.getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera.Parameters camParams = camera.getParameters();
|
|
||||||
if(flashMode.equals("on")) {
|
|
||||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
|
|
||||||
} else if(flashMode.equals("off")) {
|
|
||||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
|
|
||||||
} else {
|
|
||||||
camParams.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
|
|
||||||
}
|
}
|
||||||
if (android.os.Build.VERSION.SDK_INT >= 14) {
|
private void setCameraDisplayOrientation(Activity activity ,int cameraId) {
|
||||||
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
android.hardware.Camera.CameraInfo info =
|
||||||
|
new android.hardware.Camera.CameraInfo();
|
||||||
|
android.hardware.Camera.getCameraInfo(cameraId, info);
|
||||||
|
int rotation = activity.getWindowManager().getDefaultDisplay()
|
||||||
|
.getRotation();
|
||||||
|
int degrees = 0;
|
||||||
|
switch (rotation) {
|
||||||
|
case Surface.ROTATION_0: degrees = 0; break;
|
||||||
|
case Surface.ROTATION_90: degrees = 90; break;
|
||||||
|
case Surface.ROTATION_180: degrees = 180; break;
|
||||||
|
case Surface.ROTATION_270: degrees = 270; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
try { camera.setParameters(camParams); }
|
int result;
|
||||||
catch (RuntimeException e) {
|
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
|
||||||
Log.d("csZBar", "Unsupported camera parameter reported for flash mode: "+flashMode);
|
result = (info.orientation + degrees) % 360;
|
||||||
|
result = (360 - result) % 360; // compensate the mirror
|
||||||
|
} else { // back-facing
|
||||||
|
result = (info.orientation - degrees + 360) % 360;
|
||||||
}
|
}
|
||||||
|
camera.setDisplayOrientation(result);
|
||||||
tryStartPreview();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause ()
|
public void onPause ()
|
||||||
{
|
{
|
||||||
@ -207,7 +256,7 @@ implements SurfaceHolder.Callback {
|
|||||||
@Override
|
@Override
|
||||||
public void onDestroy ()
|
public void onDestroy ()
|
||||||
{
|
{
|
||||||
scanner.destroy();
|
if(scanner != null) scanner.destroy();
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +300,75 @@ implements SurfaceHolder.Callback {
|
|||||||
holder = hld;
|
holder = hld;
|
||||||
tryStartPreview();
|
tryStartPreview();
|
||||||
}
|
}
|
||||||
|
public void onConfigurationChanged(Configuration newConfig)
|
||||||
|
{
|
||||||
|
super.onConfigurationChanged(newConfig);
|
||||||
|
int rotation = getWindowManager().getDefaultDisplay().getRotation();
|
||||||
|
switch(rotation)
|
||||||
|
{
|
||||||
|
case 0: // '\0'
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // '\001'
|
||||||
|
rotation = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // '\002'
|
||||||
|
rotation = 270;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // '\003'
|
||||||
|
rotation = 180;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
camera.setDisplayOrientation(rotation);
|
||||||
|
android.hardware.Camera.Parameters params = camera.getParameters();
|
||||||
|
tryStopPreview();
|
||||||
|
tryStartPreview();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toggleFlash(View view) {
|
||||||
|
camera.startPreview();
|
||||||
|
android.hardware.Camera.Parameters camParams = camera.getParameters();
|
||||||
|
//If the flash is set to off
|
||||||
|
try {
|
||||||
|
if (camParams.getFlashMode().equals(Parameters.FLASH_MODE_OFF) && !(camParams.getFlashMode().equals(Parameters.FLASH_MODE_TORCH)) && !(camParams.getFlashMode().equals(Parameters.FLASH_MODE_ON)))
|
||||||
|
camParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
|
||||||
|
else //if(camParams.getFlashMode() == Parameters.FLASH_MODE_ON || camParams.getFlashMode()== Parameters.FLASH_MODE_TORCH)
|
||||||
|
camParams.setFlashMode(Parameters.FLASH_MODE_OFF);
|
||||||
|
} catch(RuntimeException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// camera.setParameters(camParams);
|
||||||
|
camera.setPreviewDisplay(holder);
|
||||||
|
camera.setPreviewCallback(previewCb);
|
||||||
|
camera.startPreview();
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= 14) {
|
||||||
|
camera.autoFocus(autoFocusCb); // We are not using any of the
|
||||||
|
// continuous autofocus modes as that does not seem to work
|
||||||
|
// well with flash setting of "on"... At least with this
|
||||||
|
// simple and stupid focus method, we get to turn the flash
|
||||||
|
// on during autofocus.
|
||||||
|
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||||
|
}
|
||||||
|
//tryStopPreview();
|
||||||
|
//tryStartPreview();
|
||||||
|
//camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||||
|
camera.setParameters(camParams);
|
||||||
|
} catch(RuntimeException e) {
|
||||||
|
Log.d("csZBar", (new StringBuilder("Unsupported camera parameter reported for flash mode: ")).append(flashMode).toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("csZBar", (new StringBuilder("Wrong holder data")).append(flashMode).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
// Continuously auto-focus -----------------------------------------
|
// Continuously auto-focus -----------------------------------------
|
||||||
// For API Level < 14
|
// For API Level < 14
|
||||||
|
|
||||||
@ -380,8 +497,43 @@ implements SurfaceHolder.Callback {
|
|||||||
private void tryStartPreview () {
|
private void tryStartPreview () {
|
||||||
if(holder != null) {
|
if(holder != null) {
|
||||||
try {
|
try {
|
||||||
|
int rotation = getWindowManager().getDefaultDisplay().getRotation();
|
||||||
|
switch(rotation)
|
||||||
|
{
|
||||||
|
case 0: // '\0'
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // '\001'
|
||||||
|
rotation = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // '\002'
|
||||||
|
rotation = 270;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // '\003'
|
||||||
|
rotation = 180;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
}
|
||||||
// 90 degrees rotation for Portrait orientation Activity.
|
// 90 degrees rotation for Portrait orientation Activity.
|
||||||
camera.setDisplayOrientation(90);
|
// camera.setDisplayOrientation(rotation);
|
||||||
|
setCameraDisplayOrientation(this, 0);
|
||||||
|
|
||||||
|
android.hardware.Camera.Parameters camParams = camera.getParameters();
|
||||||
|
|
||||||
|
//camParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
|
||||||
|
|
||||||
|
try {
|
||||||
|
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||||
|
camera.setParameters(camParams);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO: don't swallow
|
||||||
|
}
|
||||||
|
|
||||||
camera.setPreviewDisplay(holder);
|
camera.setPreviewDisplay(holder);
|
||||||
camera.setPreviewCallback(previewCb);
|
camera.setPreviewCallback(previewCb);
|
||||||
|
BIN
android/libs/arm64-v8a/libiconv.so
Executable file
BIN
android/libs/arm64-v8a/libiconv.so
Executable file
Binary file not shown.
BIN
android/libs/arm64-v8a/libzbarjni.so
Executable file
BIN
android/libs/arm64-v8a/libzbarjni.so
Executable file
Binary file not shown.
BIN
android/res/drawable/camera_flash.png
Normal file
BIN
android/res/drawable/camera_flash.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/csZbarScannerView"
|
android:id="@+id/csZbarScannerView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:background="@color/csZbarScannerBackground" >
|
android:background="@color/csZbarScannerBackground" >
|
||||||
|
|
||||||
<TextView android:id="@+id/csZbarScannerTitle"
|
<TextView android:id="@+id/csZbarScannerTitle"
|
||||||
@ -18,29 +18,29 @@
|
|||||||
android:textColor="@color/csZbarScannerTextColor"
|
android:textColor="@color/csZbarScannerTextColor"
|
||||||
android:background="@color/csZbarScannerTextBackground"
|
android:background="@color/csZbarScannerTextBackground"
|
||||||
android:fontFamily="sans-serif-light"
|
android:fontFamily="sans-serif-light"
|
||||||
android:textSize="20pt" />
|
android:textSize="15pt" />
|
||||||
|
|
||||||
<TextView android:id="@+id/csZbarScannerInstructions"
|
<TextView android:id="@+id/csZbarScannerInstructions"
|
||||||
android:layout_gravity="bottom|center_horizontal"
|
android:layout_gravity="center|bottom"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="296dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingTop="5dp"
|
android:paddingTop="5dp"
|
||||||
android:paddingBottom="15dp"
|
android:paddingBottom="15dp"
|
||||||
android:paddingLeft="5dp"
|
android:paddingLeft="5dp"
|
||||||
android:paddingRight="5dp"
|
android:paddingRight="5dp"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textSize="12pt"
|
android:textSize="8pt"
|
||||||
android:textColor="@color/csZbarScannerTextColor"
|
android:textColor="@color/csZbarScannerTextColor"
|
||||||
android:background="@color/csZbarScannerTextBackground"
|
|
||||||
android:fontFamily="sans-serif-light"
|
android:fontFamily="sans-serif-light"
|
||||||
android:text="@string/csZbarScannerInstructions" />
|
android:text="@string/csZbarScannerInstructions" />
|
||||||
|
|
||||||
<RelativeLayout android:id="@+id/csZbarScannerSightContainer"
|
<RelativeLayout android:id="@+id/csZbarScannerSightContainer"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="fill_parent">
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_gravity="center_horizontal|bottom">
|
||||||
|
|
||||||
<View android:id="@+id/csZbarScannerSight"
|
<View android:id="@+id/csZbarScannerSight"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1dp"
|
android:layout_height="1dp"
|
||||||
android:layout_marginLeft="10dp"
|
android:layout_marginLeft="10dp"
|
||||||
android:layout_marginRight="10dp"
|
android:layout_marginRight="10dp"
|
||||||
@ -48,6 +48,19 @@
|
|||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:background="#ff0000" />
|
android:background="#ff0000" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="70dp"
|
||||||
|
android:id="@+id/imageButton"
|
||||||
|
android:src="@drawable/camera_flash"
|
||||||
|
android:background="@color/csZbarScannerTextBackground"
|
||||||
|
android:onClick="toggleFlash"
|
||||||
|
android:longClickable="true"
|
||||||
|
android:visibility="visible"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentEnd="true" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "AlmaZBarReaderViewController.h"
|
#import "AlmaZBarReaderViewController.h"
|
||||||
|
#import "CsZbar.h"
|
||||||
|
|
||||||
@interface AlmaZBarReaderViewController ()
|
@interface AlmaZBarReaderViewController ()
|
||||||
|
|
||||||
@ -14,28 +15,92 @@
|
|||||||
|
|
||||||
@implementation AlmaZBarReaderViewController
|
@implementation AlmaZBarReaderViewController
|
||||||
|
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
// Do any additional setup after loading the view.
|
// Do any additional setup after loading the view.
|
||||||
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
||||||
|
//[button setTitle:@"Flash" forState:UIControlStateNormal];
|
||||||
|
[button sizeToFit];
|
||||||
|
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
||||||
|
//[button setContentEdgeInsets:UIEdgeInsetsMake(20, 30, 20, 30)];
|
||||||
|
CGRect frame;
|
||||||
|
if(screenRect.size.height>(screenRect.size.width)){
|
||||||
|
frame = CGRectMake(0,0, screenRect.size.width*(0.15), screenRect.size.height*0.15);
|
||||||
|
|
||||||
|
//button.center = CGPointMake( 0,0);
|
||||||
|
}else{
|
||||||
|
frame = CGRectMake(0,0, screenRect.size.width*(0.10), screenRect.size.height*0.20);
|
||||||
|
|
||||||
|
//button.center = CGPointMake(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
button.frame =frame;
|
||||||
|
button.layer.cornerRadius = 10;
|
||||||
|
button.clipsToBounds = YES;
|
||||||
|
// Set a new (x,y) point for the button's center
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//[button setBackgroundColor:[UIColor colorWithRed:.859 green:.765 blue:.616 alpha:1.0] forState:UIControlStateHighlighted];
|
||||||
|
|
||||||
|
//button.center = CGPointMake( 0,0);
|
||||||
|
[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
|
[self.view addSubview:button];
|
||||||
|
|
||||||
|
}
|
||||||
|
- (BOOL)prefersStatusBarHidden {
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)didReceiveMemoryWarning {
|
- (void)didReceiveMemoryWarning {
|
||||||
[super didReceiveMemoryWarning];
|
[super didReceiveMemoryWarning];
|
||||||
// Dispose of any resources that can be recreated.
|
// Dispose of any resources that can be recreated.
|
||||||
}
|
}
|
||||||
|
//Techedge Changes NSS fase 2
|
||||||
|
- (void)buttonPressed: (UIButton *) button {
|
||||||
|
|
||||||
|
CsZBar *obj = [[CsZBar alloc] init];
|
||||||
|
|
||||||
|
[obj toggleflash];
|
||||||
|
|
||||||
-(BOOL)shouldAutorotate{
|
|
||||||
return NO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
#pragma mark - Navigation
|
|
||||||
|
|
||||||
// In a storyboard-based application, you will often want to do a little preparation before navigation
|
- (BOOL)shouldAutorotate{
|
||||||
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
return YES;
|
||||||
|
}
|
||||||
|
- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
|
||||||
|
//AlmaZBarReaderViewController.scanner.scanner.cameraOverlayView = poli
|
||||||
|
//NSDictionary *params = (NSDictionary*) [command argumentAtIndex:0];
|
||||||
|
BOOL drawSight = true;//[params objectForKey:@"drawSight"] ? [[params objectForKey:@"drawSight"] boolValue] : true;
|
||||||
|
if(drawSight){
|
||||||
|
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
||||||
|
CGFloat screenWidth = screenRect.size.width;
|
||||||
|
CGFloat screenHeight = screenRect.size.height;
|
||||||
|
CGFloat dim = screenWidth < screenHeight ? screenWidth / 1.1 : screenHeight / 1.1;
|
||||||
|
UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( (screenWidth/2) - (dim/2), (screenHeight/2) - (dim/2), dim, dim)];
|
||||||
|
//polygonView.center = self.scanReader.view.center;
|
||||||
|
//polygonView.layer.borderColor = [UIColor greenColor].CGColor;
|
||||||
|
//polygonView.layer.borderWidth = 3.0f;
|
||||||
|
|
||||||
|
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,dim / 2, dim, 1)];
|
||||||
|
lineView.backgroundColor = [UIColor redColor];
|
||||||
|
[polygonView addSubview:lineView];
|
||||||
|
self.cameraOverlayView = polygonView;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
#pragma mark - Navigation
|
||||||
|
|
||||||
|
// In a storyboard-based application, you will often want to do a little preparation before navigation
|
||||||
|
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
|
||||||
// Get the new view controller using [segue destinationViewController].
|
// Get the new view controller using [segue destinationViewController].
|
||||||
// Pass the selected object to the new view controller.
|
// Pass the selected object to the new view controller.
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
#import <Cordova/CDV.h>
|
#import <Cordova/CDV.h>
|
||||||
|
|
||||||
#import "ZBarSDK.h"
|
#import "ZBarSDK.h"
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
@interface CsZBar : CDVPlugin <ZBarReaderDelegate>
|
@interface CsZBar : CDVPlugin <ZBarReaderDelegate>
|
||||||
|
|
||||||
- (void)scan: (CDVInvokedUrlCommand*)command;
|
- (void)scan: (CDVInvokedUrlCommand*)command;
|
||||||
|
- (void)toggleflash;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
67
ios/CsZBar.m
67
ios/CsZBar.m
@ -1,4 +1,5 @@
|
|||||||
#import "CsZBar.h"
|
#import "CsZBar.h"
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
#import "AlmaZBarReaderViewController.h"
|
#import "AlmaZBarReaderViewController.h"
|
||||||
|
|
||||||
#pragma mark - State
|
#pragma mark - State
|
||||||
@ -7,6 +8,7 @@
|
|||||||
@property bool scanInProgress;
|
@property bool scanInProgress;
|
||||||
@property NSString *scanCallbackId;
|
@property NSString *scanCallbackId;
|
||||||
@property AlmaZBarReaderViewController *scanReader;
|
@property AlmaZBarReaderViewController *scanReader;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
@ -25,12 +27,31 @@
|
|||||||
{
|
{
|
||||||
self.scanInProgress = NO;
|
self.scanInProgress = NO;
|
||||||
}
|
}
|
||||||
|
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
|
||||||
|
{
|
||||||
|
return YES; //(interfaceOrientation == UIInterfaceOrientationPortrait);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
- (void)viewDidLoad {
|
||||||
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||||
|
[button setTitle:@"Turn on Flash" forState:UIControlStateNormal];
|
||||||
|
[button sizeToFit];
|
||||||
|
// Set a new (x,y) point for the button's center
|
||||||
|
button.center = CGPointMake(320/2, 60);
|
||||||
|
[button addTarget:self action:@selector(flashOn) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
[self.viewController parentViewController:button];
|
||||||
|
}*/
|
||||||
|
|
||||||
#pragma mark - Plugin API
|
#pragma mark - Plugin API
|
||||||
|
|
||||||
- (void)scan: (CDVInvokedUrlCommand*)command;
|
- (void)scan: (CDVInvokedUrlCommand*)command;
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if(self.scanInProgress) {
|
if(self.scanInProgress) {
|
||||||
[self.commandDelegate
|
[self.commandDelegate
|
||||||
sendPluginResult: [CDVPluginResult
|
sendPluginResult: [CDVPluginResult
|
||||||
@ -53,29 +74,48 @@
|
|||||||
// as not all devices will have a rear-facing camera.
|
// as not all devices will have a rear-facing camera.
|
||||||
self.scanReader.cameraDevice = UIImagePickerControllerCameraDeviceFront;
|
self.scanReader.cameraDevice = UIImagePickerControllerCameraDeviceFront;
|
||||||
}
|
}
|
||||||
|
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
|
||||||
|
|
||||||
NSString *flash = [params objectForKey:@"flash"];
|
NSString *flash = [params objectForKey:@"flash"];
|
||||||
if([flash isEqualToString:@"on"]) {
|
if([flash isEqualToString:@"on"]) {
|
||||||
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
|
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
|
||||||
} else if([flash isEqualToString:@"off"]) {
|
} else if([flash isEqualToString:@"off"]) {
|
||||||
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
|
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
|
||||||
|
}else if([flash isEqualToString:@"auto"]) {
|
||||||
|
self.scanReader.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hack to hide the bottom bar's Info button... originally based on http://stackoverflow.com/a/16353530
|
// Hack to hide the bottom bar's Info button... originally based on http://stackoverflow.com/a/16353530
|
||||||
UIView *infoButton = [[[[[self.scanReader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
|
UIView *infoButton = [[[[[self.scanReader.view.subviews objectAtIndex:2] subviews] objectAtIndex:0] subviews] objectAtIndex:3];
|
||||||
[infoButton setHidden:YES];
|
[infoButton setHidden:YES];
|
||||||
|
// Add an action in current code file (i.e. target)
|
||||||
|
// [infoButton addTarget: action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
|
||||||
BOOL drawSight = [params objectForKey:@"drawSight"] ? [[params objectForKey:@"drawSight"] boolValue] : true;
|
//UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; [button setTitle:@"Press Me" forState:UIControlStateNormal]; [button sizeToFit]; [self.view addSubview:button];
|
||||||
if(drawSight){
|
|
||||||
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
CGRect screenRect = [[UIScreen mainScreen] bounds];
|
||||||
CGFloat screenWidth = screenRect.size.width;
|
CGFloat screenWidth = screenRect.size.width;
|
||||||
CGFloat screenHeight = screenRect.size.height;
|
CGFloat screenHeight = screenRect.size.height;
|
||||||
|
|
||||||
|
|
||||||
|
BOOL drawSight = [params objectForKey:@"drawSight"] ? [[params objectForKey:@"drawSight"] boolValue] : true;
|
||||||
|
UIToolbar *toolbarViewFlash = [[UIToolbar alloc] init];
|
||||||
|
//The bar length it depends on the orientation
|
||||||
|
toolbarViewFlash.frame = CGRectMake(0.0, 0, (screenWidth > screenHeight ?screenWidth:screenHeight), 44.0);
|
||||||
|
toolbarViewFlash.barStyle = UIBarStyleBlackOpaque;
|
||||||
|
UIBarButtonItem *buttonFlash = [[UIBarButtonItem alloc] initWithTitle:@"Flash" style:UIBarButtonItemStyleDone target:self action:@selector(toggleflash)];
|
||||||
|
NSArray *buttons = [NSArray arrayWithObjects: buttonFlash, nil];
|
||||||
|
[toolbarViewFlash setItems:buttons animated:NO];
|
||||||
|
[self.scanReader.view addSubview:toolbarViewFlash];
|
||||||
|
|
||||||
|
if(drawSight){
|
||||||
|
|
||||||
CGFloat dim = screenWidth < screenHeight ? screenWidth / 1.1 : screenHeight / 1.1;
|
CGFloat dim = screenWidth < screenHeight ? screenWidth / 1.1 : screenHeight / 1.1;
|
||||||
UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( (screenWidth/2) - (dim/2), (screenHeight/2) - (dim/2), dim, dim)];
|
UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( (screenWidth/2) - (dim/2), (screenHeight/2) - (dim/2), dim, dim)];
|
||||||
//polygonView.center = self.scanReader.view.center;
|
//polygonView.center = self.scanReader.view.center;
|
||||||
//polygonView.layer.borderColor = [UIColor greenColor].CGColor;
|
//polygonView.layer.borderColor = [UIColor greenColor].CGColor;
|
||||||
//polygonView.layer.borderWidth = 3.0f;
|
//polygonView.layer.borderWidth = 3.0f;
|
||||||
|
|
||||||
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(dim / 2, 0, 1, dim)];
|
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,dim / 2, dim, 1)];
|
||||||
lineView.backgroundColor = [UIColor redColor];
|
lineView.backgroundColor = [UIColor redColor];
|
||||||
[polygonView addSubview:lineView];
|
[polygonView addSubview:lineView];
|
||||||
|
|
||||||
@ -87,6 +127,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)toggleflash{
|
||||||
|
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
|
||||||
|
[device lockForConfiguration:nil];
|
||||||
|
if (device.torchAvailable == 1) {
|
||||||
|
if (device.torchMode == 0) {
|
||||||
|
[device setTorchMode:AVCaptureTorchModeOn];
|
||||||
|
[device setFlashMode:AVCaptureFlashModeOn];
|
||||||
|
|
||||||
|
}else{
|
||||||
|
[device setTorchMode:AVCaptureTorchModeOff];
|
||||||
|
[device setFlashMode:AVCaptureFlashModeOff];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
[device unlockForConfiguration];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Helpers
|
#pragma mark - Helpers
|
||||||
|
|
||||||
@ -98,6 +155,10 @@
|
|||||||
|
|
||||||
#pragma mark - ZBarReaderDelegate
|
#pragma mark - ZBarReaderDelegate
|
||||||
|
|
||||||
|
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
|
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
|
||||||
{
|
{
|
||||||
if ([self.scanReader isBeingDismissed]) { return; }
|
if ([self.scanReader isBeingDismissed]) { return; }
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cordova-plugin-cszbar",
|
"name": "cordova-plugin-cszbar",
|
||||||
"version": "1.3.1",
|
"version": "1.3.3",
|
||||||
"description": "Plugin to integrate with the ZBar barcode scanning library.",
|
"description": "Plugin to integrate with the ZBar barcode scanning library.",
|
||||||
"cordova": {
|
"cordova": {
|
||||||
"id": "cordova-plugin-cszbar",
|
"id": "cordova-plugin-cszbar",
|
||||||
|
18
plugin.xml
18
plugin.xml
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
|
||||||
id="cordova-plugin-cszbar" version="1.3.1">
|
id="cordova-plugin-cszbar" version="1.3.2">
|
||||||
|
|
||||||
<engines>
|
<engines>
|
||||||
<engine name="cordova" version=">=3.0.0" />
|
<engine name="cordova" version=">=3.0.0" />
|
||||||
@ -23,11 +23,10 @@
|
|||||||
</feature>
|
</feature>
|
||||||
</config-file>
|
</config-file>
|
||||||
<config-file target="AndroidManifest.xml" parent="application">
|
<config-file target="AndroidManifest.xml" parent="application">
|
||||||
<activity
|
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
|
||||||
android:name="org.cloudsky.cordovaPlugins.ZBarScannerActivity"
|
android:name="org.cloudsky.cordovaPlugins.ZBarScannerActivity"
|
||||||
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
|
android:screenOrientation="fullUser"
|
||||||
android:screenOrientation="portrait" >
|
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" />
|
||||||
</activity>
|
|
||||||
</config-file>
|
</config-file>
|
||||||
<config-file target="AndroidManifest.xml" parent="/*">
|
<config-file target="AndroidManifest.xml" parent="/*">
|
||||||
<uses-feature android:name="android.hardware.camera" />
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
@ -43,6 +42,7 @@
|
|||||||
<color name="csZbarScannerTextBackground">#88000000</color>
|
<color name="csZbarScannerTextBackground">#88000000</color>
|
||||||
<color name="csZbarScannerBackground">#000000</color>
|
<color name="csZbarScannerBackground">#000000</color>
|
||||||
</config-file>
|
</config-file>
|
||||||
|
<framework src="com.android.support:support-v4:23.1.0" />
|
||||||
<resource-file src="android/res/layout/cszbarscanner.xml" target="res/layout/cszbarscanner.xml" />
|
<resource-file src="android/res/layout/cszbarscanner.xml" target="res/layout/cszbarscanner.xml" />
|
||||||
<source-file src="android/ZBarcodeFormat.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
<source-file src="android/ZBarcodeFormat.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
||||||
<source-file src="android/ZBar.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
<source-file src="android/ZBar.java" target-dir="src/org/cloudsky/cordovaPlugins" />
|
||||||
@ -52,8 +52,16 @@
|
|||||||
<source-file src="android/libs/armeabi/libzbarjni.so" target-dir="libs/armeabi" />
|
<source-file src="android/libs/armeabi/libzbarjni.so" target-dir="libs/armeabi" />
|
||||||
<source-file src="android/libs/armeabi-v7a/libiconv.so" target-dir="libs/armeabi-v7a" />
|
<source-file src="android/libs/armeabi-v7a/libiconv.so" target-dir="libs/armeabi-v7a" />
|
||||||
<source-file src="android/libs/armeabi-v7a/libzbarjni.so" target-dir="libs/armeabi-v7a" />
|
<source-file src="android/libs/armeabi-v7a/libzbarjni.so" target-dir="libs/armeabi-v7a" />
|
||||||
|
<source-file src="android/libs/arm64-v8a/libiconv.so" target-dir="libs/arm64-v8a" />
|
||||||
|
<source-file src="android/libs/arm64-v8a/libzbarjni.so" target-dir="libs/arm64-v8a" />s
|
||||||
<source-file src="android/libs/x86/libiconv.so" target-dir="libs/x86" />
|
<source-file src="android/libs/x86/libiconv.so" target-dir="libs/x86" />
|
||||||
<source-file src="android/libs/x86/libzbarjni.so" target-dir="libs/x86" />
|
<source-file src="android/libs/x86/libzbarjni.so" target-dir="libs/x86" />
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable"/>
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable-hdpi"/>
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable-ldpi"/>
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable-mdpi"/>
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable-xhdpi"/>
|
||||||
|
<source-file src="android/res/drawable/camera_flash.png" target-dir="res/drawable-xxhdpi"/>
|
||||||
</platform>
|
</platform>
|
||||||
|
|
||||||
<platform name="ios">
|
<platform name="ios">
|
||||||
|
Loading…
Reference in New Issue
Block a user