diff options
Diffstat (limited to 'android')
22 files changed, 1146 insertions, 0 deletions
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..f497968 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="net.sourceforge.zbar.android" + android:versionCode="1" + android:versionName="1.0"> + <application android:label="@string/app_name" > + <activity android:name="ACTIVITY_ENTRY_NAME" + 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/ChangeLog b/android/ChangeLog new file mode 100644 index 0000000..25ef5c5 --- /dev/null +++ b/android/ChangeLog @@ -0,0 +1,2 @@ +version 0.1: + * Add initial support for Android platform diff --git a/android/README b/android/README new file mode 100644 index 0000000..c253110 --- /dev/null +++ b/android/README @@ -0,0 +1,110 @@ +ZBar Android SDK +================ + +ZBar Bar Code Reader is an open source software suite for reading bar +codes from various sources, such as video streams, image files and raw +intensity sensors. It supports EAN-13/UPC-A, UPC-E, EAN-8, Code 128, +Code 93, Code 39, Codabar, Interleaved 2 of 5, QR Code and +DataBar. These are the JNI wrappers for developing the library on +Android platform. + +Check the ZBar home page for the latest release, mailing lists, etc. + https://github.com/mchehab/zbar + +Copyright and License +--------------------- +Licensed under the GNU Lesser General Public License, version 2.1. +http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt + +Copyright 2008-2012 © Jeff Brown <spadix@users.sourceforge.net> et al + +The Android distribution also includes pre-compiled binaries of +supporting libraries, for which copyright, license and source code +locations are as follows: + * The GNU libiconv character set conversion library + Copyright (C) 1999-2011 Free Software Foundation, Inc. + This distribution includes GNU libiconv version 1.14, licensed under + the LGPL version 2. The source code is available from + http://www.gnu.org/software/libiconv + +See included files COPYING and LICENSE.md for details. + + +Installation +------------ + +After downloading the ZBar-Android-Lib-<version>.zip file, you need to +unzip the file and add it to your Android project. Unzip the file +using your favorite method (ie: command-line, finder, windows +explorer...) + +Follow one of the two options. +Option 1 - via command line + cd <android project> + cp -r ZBar-Android-SDK-<version>/libs . + +Option 2 - via Eclipse + Right click on Android Project + Select "Import" -> "File System" + Select "Browse" (next to "From directory File" and select the + ZBar-Android-SDK-<version>/libs directory and click "Open". + Click the check box next to "libs" and the "Options" "Create top-level folder" + check box (below). + Then click "Finish". + + You should then see a "libs" folder under your project. + +Building +-------- + +Via Eclipse +You have to add the zbar.jar file to your build path + 1) select zbar.jar under libs + 2) right-click, select "Build Path" -> "Add to Build Path" + +Via command-line +You are all set; ant will automatically find jar files under the "libs" +subdirectory. + +Documentation +------------- + TDB + +Examples +-------- + +You should be able to open and build the examples directly from the +unzipped directory. You will need to run the android tools to setup +the local.properties file which sets sdk.dir. + 1) cd <unzip dir>/examples/CameraTest + 2) android update project --path . + 3) ant debug install + +If you have problems with this, please create a new Android project +and copy the necessary files from the examples. + +examples/CameraTest is a simple demonstration of how to integrate the +ZBar image scanner with the camera. + +Manually building ZBar JNI library +---------------------------------- +First download and unzip the iconv library source from + http://www.gnu.org/software/libiconv/ + +Then kick off the build from the ZBar android directory. You will +need to run the android tools to setup the local.properties file which +setups sdk.dir. + + 1) cd <zbar project>/android + 2) android update project --path . + 3) ant -Dndk.dir=<NDK path> -Diconv.src=<iconv library src> zbar-all + +This will rebuild all source files, create zbar.jar and +ZBarAndroidSDK.zip file (which bundles the jar and shared +libraries). From here, you can follow the steps for "Integrating ZBar +JNI library in Android project". + +To clean run: + ant -Dndk.dir=<NDK path> zbar-clean + +See build-ndk.xml for additional target options. diff --git a/android/ant.properties b/android/ant.properties new file mode 100644 index 0000000..ee52d86 --- /dev/null +++ b/android/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/build-ndk.xml b/android/build-ndk.xml new file mode 100644 index 0000000..938afa4 --- /dev/null +++ b/android/build-ndk.xml @@ -0,0 +1,65 @@ +<!-- +Ant build file to compile the ZBar JNI files using Android NDK tool +targets: + zbar-clean - removes build generated files, build dir, jar and zip files + zbar-ndk-build - builds the zbarjni and iconv shared libraries + zbar-compile - builds the zbar java files + zbar-jar - builds and jars the zbar java files + zbar-zip - Creates ZBarAndroidSDK-x.y.zip of jar, .so, etc + zbar-all - performs all the above :) +--> +<project name="zbar"> + <property name="project.name" value="zbar" /> + <property name="project.sdk.name" value="ZBarAndroidSDK" /> + + <target name="zbar-clean"> + <delete dir="../java/build"/> + <delete file="libs/${project.name}.jar"/> + <delete file="${ant.project.name}.zip"/> + <exec executable="${ndk.dir}/ndk-build" failonerror="true"> + <arg value="clean"/> + </exec> + </target> + + <target name="zbar-ndk-build"> + <exec executable="${ndk.dir}/ndk-build" failonerror="true"> + <arg value="ICONV_SRC=${iconv.src}" /> + </exec> + </target> + + <target name="zbar-compile" depends="zbar-ndk-build"> + <mkdir dir="../java/build" /> + <javac srcdir="../java/net" destdir="../java/build" /> + </target> + + <target name="zbar-jar" depends="zbar-compile"> + <jar destfile="libs/${project.name}.jar" basedir="../java/build"> + </jar> + </target> + + <target name="zbar-zip"> + <if><condition><not><isset property="version"/></not></condition><then> + <property name="version" value="0.2" /> + </then></if> + <zip destfile="${project.sdk.name}-${version}.zip" > + <zipfileset dir="../" prefix="${project.sdk.name}-${version}" includes="COPYING, LICENSE.md"/> + <zipfileset dir="." prefix="${project.sdk.name}-${version}" includes="README"/> + <zipfileset dir="libs" prefix="${project.sdk.name}-${version}/libs"/> + <zipfileset dir="examples" prefix="${project.sdk.name}-${version}/examples"/> + <zipfileset dir="libs" prefix="${project.sdk.name}-${version}/examples/CameraTest/libs"/> + </zip> + </target> + + <target name="zbar-all" depends="zbar-jar"> + <if><condition><not><isset property="version"/></not></condition><then> + <property name="version" value="0.2" /> + </then></if> + <zip destfile="${project.sdk.name}-${version}.zip" > + <zipfileset dir="../" prefix="${project.sdk.name}-${version}" includes="COPYING, LICENSE.md"/> + <zipfileset dir="." prefix="${project.sdk.name}-${version}" includes="README"/> + <zipfileset dir="libs" prefix="${project.sdk.name}-${version}/libs"/> + <zipfileset dir="examples" prefix="${project.sdk.name}-${version}/examples"/> + <zipfileset dir="libs" prefix="${project.sdk.name}-${version}/examples/CameraTest/libs"/> + </zip> + </target> +</project> diff --git a/android/build.xml b/android/build.xml new file mode 100644 index 0000000..e7b93ac --- /dev/null +++ b/android/build.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="ZBarAndroidSDK" 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"> + <copy file="${out.absolute.dir}/classes.jar" tofile="${jar.libs.dir}/zbar_android.jar" /> + </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="build-ndk.xml" /> + <import file="${sdk.dir}/tools/ant/build.xml" /> +</project> 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); + } + }; +} diff --git a/android/jni/Android.mk b/android/jni/Android.mk new file mode 100644 index 0000000..14f91b7 --- /dev/null +++ b/android/jni/Android.mk @@ -0,0 +1,76 @@ +# +# Android NDK makefile +# +# build - <ndk path>/ndk-build ICONV_SRC=<iconv library src> +# clean - <ndk path>/ndk-build clean +# +MY_LOCAL_PATH := $(call my-dir) + +# libiconv +include $(CLEAR_VARS) +LOCAL_PATH := $(ICONV_SRC) + +LOCAL_MODULE := libiconv + +LOCAL_CFLAGS := \ + -Wno-multichar \ + -D_ANDROID \ + -DLIBDIR="c" \ + -DBUILDING_LIBICONV \ + -DBUILDING_LIBCHARSET \ + -DIN_LIBRARY + +LOCAL_SRC_FILES := \ + lib/iconv.c \ + libcharset/lib/localcharset.c \ + lib/relocatable.c + +LOCAL_C_INCLUDES := \ + $(ICONV_SRC)/include \ + $(ICONV_SRC)/libcharset \ + $(ICONV_SRC)/libcharset/include + +include $(BUILD_SHARED_LIBRARY) + +LOCAL_LDLIBS := -llog -lcharset + +# libzbarjni +include $(CLEAR_VARS) + +LOCAL_PATH := $(MY_LOCAL_PATH) +LOCAL_MODULE := zbarjni +LOCAL_SRC_FILES := ../../java/zbarjni.c \ + ../../zbar/img_scanner.c \ + ../../zbar/decoder.c \ + ../../zbar/image.c \ + ../../zbar/symbol.c \ + ../../zbar/convert.c \ + ../../zbar/config.c \ + ../../zbar/scanner.c \ + ../../zbar/error.c \ + ../../zbar/refcnt.c \ + ../../zbar/video.c \ + ../../zbar/video/null.c \ + ../../zbar/decoder/code128.c \ + ../../zbar/decoder/code39.c \ + ../../zbar/decoder/code93.c \ + ../../zbar/decoder/codabar.c \ + ../../zbar/decoder/databar.c \ + ../../zbar/decoder/ean.c \ + ../../zbar/decoder/i25.c \ + ../../zbar/decoder/qr_finder.c \ + ../../zbar/qrcode/bch15_5.c \ + ../../zbar/qrcode/binarize.c \ + ../../zbar/qrcode/isaac.c \ + ../../zbar/qrcode/qrdec.c \ + ../../zbar/qrcode/qrdectxt.c \ + ../../zbar/qrcode/rs.c \ + ../../zbar/qrcode/util.c + +LOCAL_C_INCLUDES := ../include \ + ../zbar \ + $(ICONV_SRC)/include + +LOCAL_SHARED_LIBRARIES := libiconv + +include $(BUILD_SHARED_LIBRARY) diff --git a/android/jni/Application.mk b/android/jni/Application.mk new file mode 100644 index 0000000..7866257 --- /dev/null +++ b/android/jni/Application.mk @@ -0,0 +1 @@ +APP_ABI := armeabi armeabi-v7a x86 diff --git a/android/jni/config.h b/android/jni/config.h new file mode 100644 index 0000000..adfe324 --- /dev/null +++ b/android/jni/config.h @@ -0,0 +1,238 @@ +/* manually customized for iPhone platform */ + +#define HAVE_LANGINFO_CODESET 0 + +/* whether to build support for Code 128 symbology */ +#define ENABLE_CODE128 1 + +/* whether to build support for Code 93 symbology */ +#define ENABLE_CODE93 1 + +/* whether to build support for Code 39 symbology */ +#define ENABLE_CODE39 1 + +/* whether to build support for Codabar symbology */ +#define ENABLE_CODABAR 1 + +/* whether to build support for DataBar symbology */ +#define ENABLE_DATABAR 1 + +/* whether to build support for EAN symbologies */ +#define ENABLE_EAN 1 + +/* whether to build support for Interleaved 2 of 5 symbology */ +#define ENABLE_I25 1 + +/* whether to build support for PDF417 symbology */ +#undef ENABLE_PDF417 + +/* whether to build support for QR Code */ +#define ENABLE_QRCODE 1 + +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the <features.h> header file. */ +#undef HAVE_FEATURES_H + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the <jpeglib.h> header file. */ +#undef HAVE_JPEGLIB_H + +/* Define to 1 if you have the `jpeg' library (-ljpeg). */ +#undef HAVE_LIBJPEG + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#undef HAVE_LIBPTHREAD + +/* Define to 1 if you have the <linux/videodev2.h> header file. */ +#undef HAVE_LINUX_VIDEODEV2_H + +/* Define to 1 if you have the <linux/videodev.h> header file. */ +#undef HAVE_LINUX_VIDEODEV_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the <poll.h> header file. */ +#undef HAVE_POLL_H + +/* Define to 1 if you have the <pthread.h> header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the <sys/ipc.h> header file. */ +#undef HAVE_SYS_IPC_H + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the <sys/shm.h> header file. */ +#undef HAVE_SYS_SHM_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/times.h> header file. */ +#define HAVE_SYS_TIMES_H 1 + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the <vfw.h> header file. */ +#undef HAVE_VFW_H + +/* Define to 1 if you have the <X11/extensions/XShm.h> header file. */ +#undef HAVE_X11_EXTENSIONS_XSHM_H + +/* Define to 1 if you have the <X11/extensions/Xvlib.h> header file. */ +#undef HAVE_X11_EXTENSIONS_XVLIB_H + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Library major version */ +#define LIB_VERSION_MAJOR 0 + +/* Library minor version */ +#define LIB_VERSION_MINOR 2 + +/* Library revision */ +#define LIB_VERSION_REVISION 0 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if assertions should be disabled. */ +//#undef NDEBUG + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#define PACKAGE "zbar" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "spadix@users.sourceforge.net" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "zbar" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "zbar 0.10" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "zbar" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.10" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.10" + +/* Define to 1 if the X Window System is missing or not being used. */ +#define X_DISPLAY_MISSING 1 + +/* Program major version (before the '.') as a number */ +#define ZBAR_VERSION_MAJOR 0 + +/* Program minor version (after '.') as a number */ +#define ZBAR_VERSION_MINOR 10 + +/* Program minor version (after the second '.') as a number */ +#define ZBAR_VERSION_PATCH 0 + +/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>, + <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Minimum Windows API version */ +#undef _WIN32_WINNT + +/* used only for pthread debug attributes */ +#undef __USE_UNIX98 + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef int32_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t + +/* Define to the type of an unsigned integer type wide enough to hold a + pointer, if such a type exists, and if the system does not define it. */ +#undef uintptr_t + +#ifndef X_DISPLAY_MISSING +#define HAVE_X +#endif diff --git a/android/proguard.cfg b/android/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/android/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/project.properties b/android/project.properties new file mode 100644 index 0000000..7662246 --- /dev/null +++ b/android/project.properties @@ -0,0 +1,12 @@ +# 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. + +android.library=true +# Project target. +target=android-8 diff --git a/android/res/layout/main.xml b/android/res/layout/main.xml new file mode 100644 index 0000000..7d62fbb --- /dev/null +++ b/android/res/layout/main.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + > +<TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="Hello World, ACTIVITY_ENTRY_NAME" + /> +</LinearLayout> + diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 0000000..ee5af40 --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">ACTIVITY_ENTRY_NAME</string> +</resources> |