diff options
Diffstat (limited to 'android/examples/CameraTest')
9 files changed, 467 insertions, 0 deletions
diff --git a/android/examples/CameraTest/AndroidManifest.xml b/android/examples/CameraTest/AndroidManifest.xml new file mode 100644 index 0000000..2bc2ae7 --- /dev/null +++ b/android/examples/CameraTest/AndroidManifest.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="net.sourceforge.zbar.android.CameraTest" + android:versionCode="1" + android:versionName="1.0"> + <uses-sdk android:minSdkVersion="8" /> + <uses-permission android:name="android.permission.CAMERA" /> + <uses-feature android:name="android.hardware.camera" /> + <uses-feature android:name="android.hardware.camera.autofocus" /> + <application android:label="@string/app_name" > + <activity android:name="CameraTestActivity" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/android/examples/CameraTest/ant.properties b/android/examples/CameraTest/ant.properties new file mode 100644 index 0000000..ee52d86 --- /dev/null +++ b/android/examples/CameraTest/ant.properties @@ -0,0 +1,17 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/android/examples/CameraTest/build.xml b/android/examples/CameraTest/build.xml new file mode 100644 index 0000000..df1f293 --- /dev/null +++ b/android/examples/CameraTest/build.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="CameraTest" default="help"> + + <!-- The local.properties file is created and updated by the 'android' tool. + It contains the path to the SDK. It should *NOT* be checked into + Version Control Systems. --> + <property file="local.properties" /> + + <!-- The ant.properties file can be created by you. It is only edited by the + 'android' tool to add properties to it. + This is the place to change some Ant specific build properties. + Here are some properties you may want to change/update: + + source.dir + The name of the source directory. Default is 'src'. + out.dir + The name of the output directory. Default is 'bin'. + + For other overridable properties, look at the beginning of the rules + files in the SDK, at tools/ant/build.xml + + Properties related to the SDK location or the project target should + be updated using the 'android' tool with the 'update' action. + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. + + --> + <property file="ant.properties" /> + + <!-- The project.properties file is created and updated by the 'android' + tool, as well as ADT. + + This contains project specific properties such as project target, and library + dependencies. Lower level build properties are stored in ant.properties + (or in .classpath for Eclipse projects). + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. --> + <loadproperties srcFile="project.properties" /> + + <!-- quick check on sdk.dir --> + <fail + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var" + unless="sdk.dir" + /> + + +<!-- extension targets. Uncomment the ones where you want to do custom work + in between standard targets --> +<!-- + <target name="-pre-build"> + </target> + <target name="-pre-compile"> + </target> + + /* This is typically used for code obfuscation. + Compiled code location: ${out.classes.absolute.dir} + If this is not done in place, override ${out.dex.input.absolute.dir} */ + <target name="-post-compile"> + </target> +--> + + <!-- Import the actual build file. + + To customize existing targets, there are two options: + - Customize only one target: + - copy/paste the target into this file, *before* the + <import> task. + - customize it to your needs. + - Customize the whole content of build.xml + - copy/paste the content of the rules files (minus the top node) + into this file, replacing the <import> task. + - customize to your needs. + + *********************** + ****** IMPORTANT ****** + *********************** + In all cases you must update the value of version-tag below to read 'custom' instead of an integer, + in order to avoid having your file be overridden by tools such as "android update project" + --> + <!-- version-tag: 1 --> + <import file="${sdk.dir}/tools/ant/build.xml" /> + +</project> diff --git a/android/examples/CameraTest/proguard.cfg b/android/examples/CameraTest/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/android/examples/CameraTest/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native <methods>; +} + +-keepclasseswithmembers class * { + public <init>(android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public <init>(android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/android/examples/CameraTest/project.properties b/android/examples/CameraTest/project.properties new file mode 100644 index 0000000..8da376a --- /dev/null +++ b/android/examples/CameraTest/project.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-15 diff --git a/android/examples/CameraTest/res/layout/main.xml b/android/examples/CameraTest/res/layout/main.xml new file mode 100644 index 0000000..36279a1 --- /dev/null +++ b/android/examples/CameraTest/res/layout/main.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <FrameLayout + android:id="@+id/cameraPreview" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + /> + + <TextView + android:id="@+id/scanText" + android:text="Scanning..." + android:layout_height="wrap_content" + android:layout_width="match_parent"> + </TextView> + <Button + android:id="@+id/ScanButton" + android:text="Scan" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + /> +</LinearLayout> diff --git a/android/examples/CameraTest/res/values/strings.xml b/android/examples/CameraTest/res/values/strings.xml new file mode 100644 index 0000000..c1b70c2 --- /dev/null +++ b/android/examples/CameraTest/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ZBar CameraTest</string> +</resources> diff --git a/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraPreview.java b/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraPreview.java new file mode 100644 index 0000000..41efe68 --- /dev/null +++ b/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraPreview.java @@ -0,0 +1,108 @@ +/* + * Barebones implementation of displaying camera preview. + * + * Created by lisah0 on 2012-02-24 + */ +package net.sourceforge.zbar.android.CameraTest; + +import java.io.IOException; + +import android.app.Activity; +import android.os.Bundle; + +import android.util.Log; + +import android.view.View; +import android.view.Surface; +import android.view.SurfaceView; +import android.view.SurfaceHolder; + +import android.content.Context; + +import android.hardware.Camera; +import android.hardware.Camera.PreviewCallback; +import android.hardware.Camera.AutoFocusCallback; +import android.hardware.Camera.Parameters; + +/** A basic Camera preview class */ +public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { + private SurfaceHolder mHolder; + private Camera mCamera; + private PreviewCallback previewCallback; + private AutoFocusCallback autoFocusCallback; + + public CameraPreview(Context context, Camera camera, + PreviewCallback previewCb, + AutoFocusCallback autoFocusCb) { + super(context); + mCamera = camera; + previewCallback = previewCb; + autoFocusCallback = autoFocusCb; + + /* + * Set camera to continuous focus if supported, otherwise use + * software auto-focus. Only works for API level >=9. + */ + /* + Camera.Parameters parameters = camera.getParameters(); + for (String f : parameters.getSupportedFocusModes()) { + if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) { + mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); + autoFocusCallback = null; + break; + } + } + */ + + // Install a SurfaceHolder.Callback so we get notified when the + // underlying surface is created and destroyed. + mHolder = getHolder(); + mHolder.addCallback(this); + + // deprecated setting, but required on Android versions prior to 3.0 + mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + } + + public void surfaceCreated(SurfaceHolder holder) { + // The Surface has been created, now tell the camera where to draw the preview. + try { + mCamera.setPreviewDisplay(holder); + } catch (IOException e) { + Log.d("DBG", "Error setting camera preview: " + e.getMessage()); + } + } + + public void surfaceDestroyed(SurfaceHolder holder) { + // Camera preview released in activity + } + + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + /* + * If your preview can change or rotate, take care of those events here. + * Make sure to stop the preview before resizing or reformatting it. + */ + if (mHolder.getSurface() == null){ + // preview surface does not exist + return; + } + + // stop preview before making changes + try { + mCamera.stopPreview(); + } catch (Exception e){ + // ignore: tried to stop a non-existent preview + } + + try { + // Hard code camera surface rotation 90 degs to match Activity view in portrait + mCamera.setDisplayOrientation(90); + + mCamera.setPreviewDisplay(mHolder); + mCamera.setPreviewCallback(previewCallback); + mCamera.startPreview(); + mCamera.autoFocus(autoFocusCallback); + } catch (Exception e){ + Log.d("DBG", "Error starting camera preview: " + e.getMessage()); + } + } +} diff --git a/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraTestActivity.java b/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraTestActivity.java new file mode 100644 index 0000000..e20bcad --- /dev/null +++ b/android/examples/CameraTest/src/net/sourceforge/zbar/android/CameraTest/CameraTestActivity.java @@ -0,0 +1,155 @@ +/* + * Basic no frills app which integrates the ZBar barcode scanner with + * the camera. + * + * Created by lisah0 on 2012-02-24 + */ +package net.sourceforge.zbar.android.CameraTest; + +import net.sourceforge.zbar.android.CameraTest.CameraPreview; + +import android.app.Activity; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; + +import android.view.View; +import android.view.View.OnClickListener; +import android.view.Window; +import android.widget.FrameLayout; +import android.widget.Button; + +import android.hardware.Camera; +import android.hardware.Camera.PreviewCallback; +import android.hardware.Camera.AutoFocusCallback; +import android.hardware.Camera.Parameters; +import android.hardware.Camera.Size; + +import android.widget.TextView; +import android.graphics.ImageFormat; + +/* Import ZBar Class files */ +import net.sourceforge.zbar.ImageScanner; +import net.sourceforge.zbar.Image; +import net.sourceforge.zbar.Symbol; +import net.sourceforge.zbar.SymbolSet; +import net.sourceforge.zbar.Config; + +public class CameraTestActivity extends Activity +{ + private Camera mCamera; + private CameraPreview mPreview; + private Handler autoFocusHandler; + + TextView scanText; + Button scanButton; + + ImageScanner scanner; + + private boolean barcodeScanned = false; + private boolean previewing = true; + + static { + System.loadLibrary("iconv"); + } + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.main); + + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + + autoFocusHandler = new Handler(); + mCamera = getCameraInstance(); + + /* Instance barcode scanner */ + scanner = new ImageScanner(); + scanner.setConfig(0, Config.X_DENSITY, 3); + scanner.setConfig(0, Config.Y_DENSITY, 3); + + mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB); + FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview); + preview.addView(mPreview); + + scanText = (TextView)findViewById(R.id.scanText); + + scanButton = (Button)findViewById(R.id.ScanButton); + + scanButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + if (barcodeScanned) { + barcodeScanned = false; + scanText.setText("Scanning..."); + mCamera.setPreviewCallback(previewCb); + mCamera.startPreview(); + previewing = true; + mCamera.autoFocus(autoFocusCB); + } + } + }); + } + + public void onPause() { + super.onPause(); + releaseCamera(); + } + + /** A safe way to get an instance of the Camera object. */ + public static Camera getCameraInstance(){ + Camera c = null; + try { + c = Camera.open(); + } catch (Exception e){ + } + return c; + } + + private void releaseCamera() { + if (mCamera != null) { + previewing = false; + mCamera.setPreviewCallback(null); + mCamera.release(); + mCamera = null; + } + } + + private Runnable doAutoFocus = new Runnable() { + public void run() { + if (previewing) + mCamera.autoFocus(autoFocusCB); + } + }; + + PreviewCallback previewCb = new PreviewCallback() { + public void onPreviewFrame(byte[] data, Camera camera) { + Camera.Parameters parameters = camera.getParameters(); + Size size = parameters.getPreviewSize(); + + Image barcode = new Image(size.width, size.height, "Y800"); + barcode.setData(data); + + int result = scanner.scanImage(barcode); + + if (result != 0) { + previewing = false; + mCamera.setPreviewCallback(null); + mCamera.stopPreview(); + + SymbolSet syms = scanner.getResults(); + for (Symbol sym : syms) { + scanText.setText("barcode result " + sym.getData()); + barcodeScanned = true; + } + } + } + }; + + // Mimic continuous auto-focusing + AutoFocusCallback autoFocusCB = new AutoFocusCallback() { + public void onAutoFocus(boolean success, Camera camera) { + autoFocusHandler.postDelayed(doAutoFocus, 1000); + } + }; +} |