11 Commits
Author SHA1 Message Date
Ryan Willoughby 4ed50488b6 [1.2.0] upped version 2013-11-27 15:07:57 -08:00
Jakob GillichandRyan Willoughby 91d7e9aa4a window.plugins is not defined anymore, replaced it with cordova.plugins
Reproduced in 3.1, see #60
2013-11-27 15:02:42 -08:00
huserben eab15a370a Updated Plugin, refactored some library parts, added description to read me 2013-11-09 20:35:15 +01:00
huserben a7bf6fc2c0 added windows phone version 2013-11-09 12:38:54 +01:00
Ryan Willoughby ba3c96c386 [js] plugin.xml asset backwards compat 2013-09-27 10:49:55 -07:00
Ryan Willoughby 24acf29896 [plugin.xml] corrected supported cordova versions 2013-09-26 16:43:13 -07:00
Ryan Willoughby a310fda2d7 delete plugin.xml.generate.php 2013-09-12 15:41:33 -07:00
Ryan Willoughby 8bf3cce073 Use <js-module> in favour of <asset> for the JS
Merge branch 'js_module' of https://github.com/agrieve/BarcodeScanner

Conflicts:
	README.md
	plugin.xml
2013-09-12 15:38:05 -07:00
Ryan Willoughby 2d8701634f [readme] fixed encode syntax typo 2013-09-11 15:03:53 -07:00
Ryan Willoughby 7880bf7b5c [android][0.7.2] remove busted menu items
+ fixes #11
2013-09-11 13:58:26 -07:00
Andrew Grieve 6ad6dafc11 Use <js-module> in favour of <asset> for the JS.
This bumps the version to 1.0 since it's a non-backwards compatible
change.
2013-09-05 15:13:13 -04:00
10 changed files with 315 additions and 259 deletions
+8 -9
View File
@@ -1,12 +1,15 @@
BarcodeScanner
==============
Added version that runs with windows mobile devices.
To run on those devices, the zxing.net library must be added to the project (Install as nuget packet - more information on http://www.nuget.org/packages/ZXing.Net)
Windows Phone currently only supports Scaning for codes, feel free to extend it that it can also encode.
Cross-platform BarcodeScanner for Cordova / PhoneGap.
Follows the [Cordova Plugin spec](https://github.com/apache/cordova-plugman/blob/master/plugin_spec.md), so that it works with [Plugman](https://github.com/apache/cordova-plugman).
This plugin leverages Cordova/PhoneGap's [require/define functionality used for plugins](http://simonmacdonald.blogspot.ca/2012/08/so-you-wanna-write-phonegap-200-android.html).
Note: the Android source for this project includes an Android Library Project.
plugman currently doesn't support Library Project refs, so its been
prebuilt as a jar library. Any updates to the Library Project should be
@@ -49,9 +52,7 @@ The following barcode types are currently supported:
A full example could be:
```
var scanner = cordova.require("cordova/plugin/BarcodeScanner");
scanner.scan(
cordova.plugins.barcodeScanner.scan(
function (result) {
alert("We got a barcode\n" +
"Result: " + result.text + "\n" +
@@ -65,7 +66,7 @@ A full example could be:
```
## Encoding a Barcode ##
The plugin creates the object `window.plugins.barcodeScanner` with the method `encode(type, data, success, fail)`.
The plugin creates the object `cordova.plugins.barcodeScanner` with the method `encode(type, data, success, fail)`.
Supported encoding types:
* TEXT_TYPE
@@ -76,9 +77,7 @@ Supported encoding types:
```
A full example could be:
var scanner = cordova.require("cordova/plugin/BarcodeScanner");
scanner.encode(BarcodeScanner.Encode.TEXT_TYPE, "http://www.nytimes.com", function(success) {
cordova.plugins.barcodeScanner.encode(BarcodeScanner.Encode.TEXT_TYPE, "http://www.nytimes.com", function(success) {
alert("encode success: " + success);
}, function(fail) {
alert("encoding failed: " + fail);
+34 -5
View File
@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?><plugin xmlns="http://www.phonegap.com/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="com.phonegap.plugins.barcodescanner"
version="0.7.1">
version="1.2.0">
<name>BarcodeScanner</name>
<description>Scans Barcodes.</description>
<license>MIT</license>
<engines>
<engine name="cordova" version=">=2.8.0" />
<engine name="cordova" version=">=3.0.0" />
</engines>
<js-module src="www/barcodescanner.js" name="BarcodeScanner">
<clobbers target="cordova.plugins.barcodeScanner" />
</js-module>
<asset src="www/barcodescanner.js" target="barcodescanner.js" />
<license>MIT</license>
<!-- ios -->
<platform name="ios">
@@ -35,7 +37,34 @@
<framework src="AVFoundation.framework" />
<framework src="AssetsLibrary.framework" />
<framework src="CoreVideo.framework" />
<framework src="QuartzCore.framework" />
</platform>
<platform name="wp7">
<config-file target="config.xml" parent="/*">
<feature name="BarcodeScanner">
<param name="wp-package" value="BarcodeScanner"/>
</feature>
</config-file>
<source-file src="src/wp/BarcodeScanner.cs" />
<source-file src="src/wp/BarcodeScannerResult.cs" />
<source-file src="src/wp/Scan.xaml.cs" />
<source-file src="src/wp/Scan.xaml" />
</platform>
<platform name="wp8">
<config-file target="config.xml" parent="/*">
<feature name="BarcodeScanner">
<param name="wp-package" value="BarcodeScanner"/>
</feature>
</config-file>
<source-file src="src/wp/BarcodeScanner.cs" />
<source-file src="src/wp/BarcodeScannerResult.cs" />
<source-file src="src/wp/Scan.xaml.cs" />
<source-file src="src/wp/Scan.xaml" />
</platform>
<!-- android -->
<platform name="android">
-216
View File
@@ -1,216 +0,0 @@
<?php
class PluginHelper {
public $basePath = 'src/android/LibraryProject/';
private function perror($msg)
{
file_put_contents('php://stderr', $msg, FILE_APPEND);
}
/**
* Get contents of an XML file.
*
* @param string $xmlFilePath The XML file path relative to $this->basePath.
* @param string $parent Parent element from which to get children.
* @param array $options
* <li>ident - ident chanracters.
* <li>ignorePattern - pattern that will be matched to XML.
* @return string
*/
public function getXml($xmlFilePath, $parent, $options=array())
{
if (!isset($options['indent']))
{
$options['indent'] = "";
}
$contents = "";
$filePath = $this->basePath . $xmlFilePath;
if (!file_exists($filePath))
{
$this->perror("File $filePath does not exist");
return $contents;
}
$xml = file_get_contents($this->basePath . $xmlFilePath);
$document = new SimpleXMLElement($xml);
$els = $document->xpath($parent);
if (!empty($els))
{
$rootNode = $els[0];
foreach ($rootNode->children() as $child)
{
$childContent = $child->asXML();
if (isset($options['ignorePattern']) && preg_match($options['ignorePattern'], $childContent))
{
$this->perror("\nignored $childContent");
continue;
}
$contents .= "\n" . $options['indent'] . $childContent;
}
$contents = ltrim ($contents) . "\n";
return $contents;
}
else
{
$this->perror("Path $parent not found in $xmlFilePath");
return $contents;
}
}
/**
* Generate source-file tags to copy all resources from given dir.
*
* @param type $dir Dir path relative to $this->basePath.
* @param array $options
* <li>ident - ident chanracters.
*/
public function sourceFiles($dir, $options=array())
{
//ob_end_clean();
if (!isset($options['indent']))
{
$options['indent'] = "";
}
$path = $this->basePath . $dir;
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
while($it->valid())
{
if (!$it->isDot())
{
$filename = strtr($it->key(), '\\', '/');
if (isset($options['ignorePattern']) && preg_match($options['ignorePattern'], $filename))
{
$this->perror("\nignored $filename");
$it->next();
continue;
}
$targetDir = preg_replace('#.+LibraryProject/(.+?)/[^/]+$#', '$1', $filename);
echo "\n{$options['indent']}<source-file src=\"$filename\" target-dir=\"$targetDir\"/>";
}
$it->next();
}
echo "\n";
//exit;
}
}
// init
$pluginHelper = new PluginHelper();
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="com.phonegap.plugins.barcodescanner"
version="0.5.3">
<name>BarcodeScanner</name>
<description>Scans Barcodes.</description>
<engines>
<engine name="cordova" version=">=2.0.0" />
</engines>
<asset src="www/barcodescanner.js" target="barcodescanner.js" />
<!-- ios -->
<platform name="ios">
<plugins-plist key="BarcodeScanner" string="CDVBarcodeScanner" />
<!-- Cordova >= 2.3 -->
<config-file target="config.xml" parent="plugins">
<plugin name="BarcodeScanner" value="CDVBarcodeScanner"/>
</config-file>
<resource-file src="src/ios/scannerOverlay.xib" />
<header-file src="src/ios/zxing-all-in-one.h" />
<source-file src="src/ios/CDVBarcodeScanner.mm" />
<source-file src="src/ios/zxing-all-in-one.cpp" />
<framework src="libiconv.dylib" />
<framework src="AVFoundation.framework" />
<framework src="AssetsLibrary.framework" />
<framework src="CoreVideo.framework" />
</platform>
<!-- android -->
<platform name="android">
<source-file src="src/android/com/phonegap/plugins/barcodescanner/BarcodeScanner.java" target-dir="src/com/phonegap/plugins/barcodescanner" />
<!--
<source-file src="R.java" target-dir="src/com/google/zxing/client/android" />
-->
<config-file target="res/xml/plugins.xml" parent="/plugins">
<plugin name="BarcodeScanner" value="com.phonegap.plugins.barcodescanner.BarcodeScanner"/>
</config-file>
<config-file target="res/xml/config.xml" parent="plugins">
<plugin name="BarcodeScanner" value="com.phonegap.plugins.barcodescanner.BarcodeScanner"/>
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden"
android:exported="false">
<intent-filter>
<action android:name="com.phonegap.plugins.barcodescanner.SCAN"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name="com.google.zxing.client.android.encode.EncodeActivity" android:label="@string/share_name">
<intent-filter>
<action android:name="com.phonegap.plugins.barcodescanner.ENCODE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name="com.google.zxing.client.android.HelpActivity" android:label="@string/share_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<!-- Not required to allow users to work around this -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
</config-file>
<source-file src="src/android/com.google.zxing.client.android.captureactivity.jar" target-dir="libs"/>
<!--
LibraryProject/res/*.*
search: (src/android/LibraryProject/(.+?)/[^/]+)$
replace: <source-file src="$1" target-dir="$2"/>
-->
<?
$pluginHelper->sourceFiles("res", array('indent'=>"\t\t", 'ignorePattern' => '#values/strings.xml#'));
?>
<!-- plugman cannot merge - prepare manual merge -->
<config-file target="res/values/strings.xml" parent="/resources">
<?=$pluginHelper->getXml('res/values/strings.xml', "/resources", array('ignorePattern' => '/name="(app_name|menu_settings)"/', 'indent' => "\t\t\t"))?>
</config-file>
</platform>
</plugin>
<?php
$pluginText = ob_get_clean();
file_put_contents("plugin.xml", $pluginText);
?>
@@ -15,20 +15,5 @@
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_share"
android:title="@string/menu_share"
android:icon="@android:drawable/ic_menu_share"
android:orderInCategory="1"/>
<item android:id="@+id/menu_history"
android:title="@string/menu_history"
android:icon="@android:drawable/ic_menu_recent_history"
android:orderInCategory="2"/>
<item android:id="@+id/menu_settings"
android:title="@string/menu_settings"
android:icon="@android:drawable/ic_menu_preferences"
android:orderInCategory="3"/>
<item android:id="@+id/menu_help"
android:title="@string/menu_help"
android:icon="@android:drawable/ic_menu_help"
android:orderInCategory="4"/>
<!-- removed nonfunctional menu - see file history to retrieve -->
</menu>
@@ -15,12 +15,5 @@
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_share"
android:title="@string/menu_share"
android:icon="@android:drawable/ic_menu_share"
android:orderInCategory="1"/>
<item android:id="@+id/menu_encode"
android:title="@string/menu_encode_vcard"
android:icon="@android:drawable/ic_menu_sort_alphabetically"
android:orderInCategory="2"/>
<!-- removed nonfunctional menu - see file history to retrieve -->
</menu>
+46
View File
@@ -0,0 +1,46 @@
using BarcodeScanner;
using Microsoft.Phone.Controls;
using System;
using System.Windows;
using System.Windows.Navigation;
using WPCordovaClassLib.Cordova;
using WPCordovaClassLib.Cordova.Commands;
using WPCordovaClassLib.Cordova.JSON;
namespace Cordova.Extension.Commands
{
public class BarcodeScanner : BaseCommand
{
private PhoneApplicationFrame currentRootVisual;
public void scan(string options)
{
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
currentRootVisual = Application.Current.RootVisual as PhoneApplicationFrame;
currentRootVisual.Navigated += OnFrameNavigated;
currentRootVisual.Navigate(new Uri("/Plugins/com.phonegap.plugins.barcodescanner/Scan.xaml", UriKind.Relative));
});
}
private void OnFrameNavigated(object sender, NavigationEventArgs e)
{
var scanPage = e.Content as Scan;
if (scanPage != null)
{
scanPage.BarcodeScannerPlugin = this;
}
}
public void OnScanFailed(string error)
{
DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, error));
}
public void OnScanSucceeded(BarcodeScannerResult scanResult)
{
var resultString = JsonHelper.Serialize(scanResult);
DispatchCommandResult(new PluginResult(PluginResult.Status.OK, resultString));
}
}
}
+23
View File
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BarcodeScanner
{
public class BarcodeScannerResult
{
public string format
{
get;
set;
}
public string text
{
get;
set;
}
}
}
+40
View File
@@ -0,0 +1,40 @@
<phone:PhoneApplicationPage
x:Class="BarcodeScanner.Scan"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Canvas x:Name="viewfinderCanvas">
<!--Camera viewfinder -->
<Canvas.Background>
<VideoBrush x:Name="viewfinderBrush">
<VideoBrush.RelativeTransform>
<CompositeTransform
x:Name="viewfinderTransform"
CenterX="0.5"
CenterY="0.5"
Rotation="90"/>
</VideoBrush.RelativeTransform>
</VideoBrush>
</Canvas.Background>
</Canvas>
</Grid>
</phone:PhoneApplicationPage>
+151
View File
@@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Microsoft.Devices;
using System.Windows.Threading;
using System.Windows.Media.Imaging;
using ZXing;
namespace BarcodeScanner
{
public partial class Scan : PhoneApplicationPage
{
private PhotoCamera phoneCamera;
private IBarcodeReader barcodeReader;
private DispatcherTimer scanTimer;
private WriteableBitmap previewBuffer;
private string scannedCode = string.Empty;
private bool scanSucceeded;
public Scan()
{
InitializeComponent();
}
public Cordova.Extension.Commands.BarcodeScanner BarcodeScannerPlugin
{
get;
set;
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
// Initialize the camera object
phoneCamera = new PhotoCamera();
phoneCamera.Initialized += OnCameraInitialized;
CameraButtons.ShutterKeyHalfPressed += OnCameraButtonShutterKeyHalfPressed;
//Display the camera feed in the UI
viewfinderBrush.SetSource(phoneCamera);
// This timer will be used to scan the camera buffer every 250ms and scan for any barcodes
scanTimer = new DispatcherTimer();
scanTimer.Interval = TimeSpan.FromMilliseconds(250);
scanTimer.Tick += (o, arg) => ScanForBarcode();
base.OnNavigatedTo(e);
}
private void OnCameraButtonShutterKeyHalfPressed(object sender, EventArgs e)
{
phoneCamera.Focus();
}
protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
scanTimer.Stop();
if (phoneCamera != null)
{
phoneCamera.Dispose();
phoneCamera.Initialized -= OnCameraInitialized;
CameraButtons.ShutterKeyHalfPressed -= OnCameraButtonShutterKeyHalfPressed;
}
if (!scanSucceeded)
{
BarcodeScannerPlugin.OnScanFailed("Cancelled by user");
}
}
void OnCameraInitialized(object sender, Microsoft.Devices.CameraOperationCompletedEventArgs e)
{
if (e.Succeeded)
{
this.Dispatcher.BeginInvoke(delegate()
{
phoneCamera.FlashMode = FlashMode.Off;
previewBuffer = new WriteableBitmap((int)phoneCamera.PreviewResolution.Width, (int)phoneCamera.PreviewResolution.Height);
barcodeReader = new BarcodeReader();
// By default, BarcodeReader will scan every supported barcode type
// If we want to limit the type of barcodes our app can read,
// we can do it by adding each format to this list object
//var supportedBarcodeFormats = new List<BarcodeFormat>();
//supportedBarcodeFormats.Add(BarcodeFormat.QR_CODE);
//supportedBarcodeFormats.Add(BarcodeFormat.DATA_MATRIX);
//_bcReader.PossibleFormats = supportedBarcodeFormats;
barcodeReader.Options.TryHarder = true;
barcodeReader.ResultFound += OnBarcodeResultFound;
scanTimer.Start();
});
}
else
{
Dispatcher.BeginInvoke(() =>
{
BarcodeScannerPlugin.OnScanFailed("Unable to initialize the camera");
});
}
}
private void OnBarcodeResultFound(Result obj)
{
if (BarcodeIsValid(obj.Text))
{
var barcodeScannerResult = new BarcodeScannerResult();
barcodeScannerResult.format = obj.BarcodeFormat.ToString();
barcodeScannerResult.text = obj.Text;
scanSucceeded = true;
BarcodeScannerPlugin.OnScanSucceeded(barcodeScannerResult);
NavigationService.GoBack();
}
}
private bool BarcodeIsValid(string barcode)
{
if (barcode.Equals(scannedCode))
{
return false;
}
return true;
}
private void ScanForBarcode()
{
//grab a camera snapshot
phoneCamera.GetPreviewBufferArgb32(previewBuffer.Pixels);
previewBuffer.Invalidate();
//scan the captured snapshot for barcodes
//if a barcode is found, the ResultFound event will fire
barcodeReader.Decode(previewBuffer);
}
}
}
+11 -5
View File
@@ -6,10 +6,7 @@
* Copyright (c) 2011, IBM Corporation
*/
cordova.define("cordova/plugin/BarcodeScanner",
function (require, exports, module) {
var ScannerLoader = function (require, exports, module) {
var exec = require("cordova/exec");
@@ -88,4 +85,13 @@ cordova.define("cordova/plugin/BarcodeScanner",
var barcodeScanner = new BarcodeScanner();
module.exports = barcodeScanner;
});
}
ScannerLoader(require, exports, module);
cordova.define("cordova/plugin/BarcodeScanner", ScannerLoader);