{selected.label}
diff --git a/examples/api/src/app.css b/examples/api/src/app.css
index 77704c36..2cd1b6e6 100644
--- a/examples/api/src/app.css
+++ b/examples/api/src/app.css
@@ -39,3 +39,7 @@ code.code-block {
transform: translateX(var(--translate-x));
}
}
+
+.transparent {
+ background-color: transparent;
+}
diff --git a/examples/api/src/views/Scanner.svelte b/examples/api/src/views/Scanner.svelte
new file mode 100644
index 00000000..f515ebde
--- /dev/null
+++ b/examples/api/src/views/Scanner.svelte
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Aim your camera at a QR code
+
+
+
+
+
+
+
+
diff --git a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt
index 0db12642..beac6a61 100644
--- a/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt
+++ b/plugins/barcode-scanner/android/src/main/java/BarcodeScannerPlugin.kt
@@ -8,6 +8,8 @@ import android.content.Context.MODE_PRIVATE
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
+import android.graphics.Color
+import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.os.VibrationEffect
@@ -71,11 +73,13 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
private var requestPermissionResponse: JSObject? = null
private var cameraReady = false
+ private var windowed = false
// declare a map constant for allowed barcode formats
private val supportedFormats = supportedFormats()
private var savedInvoke: Invoke? = null
+ private var webViewBackground: Drawable? = null
override fun load(webView: WebView) {
super.load(webView)
@@ -105,10 +109,9 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
}
- private fun setupCamera(cameraDirection: String) {
+ private fun setupCamera(cameraDirection: String, windowed: Boolean) {
activity
.runOnUiThread {
-
val previewView = PreviewView(activity)
previewView.layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -127,6 +130,13 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
parent.addView(previewView)
parent.addView(graphicOverlay)
+ this.windowed = windowed
+ if (windowed) {
+ webView.bringToFront()
+ webViewBackground = webView.background
+ webView.setBackgroundColor(Color.TRANSPARENT)
+ }
+
val cameraProviderFuture = ProcessCameraProvider.getInstance(activity)
cameraProviderFuture.addListener(
{
@@ -174,7 +184,6 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
}
private fun dismantleCamera() {
- // opposite of setupCamera
activity
.runOnUiThread {
if (cameraProvider != null) {
@@ -207,14 +216,22 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
return formats
}
- private fun prepareInternal(direction: String) {
+ private fun prepareInternal(direction: String, windowed: Boolean) {
dismantleCamera()
- setupCamera(direction)
+ setupCamera(direction, windowed)
}
private fun destroy() {
dismantleCamera()
savedInvoke = null
+ if (windowed) {
+ if (webViewBackground != null) {
+ webView.background = webViewBackground
+ webViewBackground = null
+ } else {
+ webView.setBackgroundColor(Color.WHITE)
+ }
+ }
}
@Suppress("DEPRECATION")
@@ -260,7 +277,8 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
scanner
?.process(inputImage)
?.addOnSuccessListener { barcodes ->
- for (barcode in barcodes) {
+ if (barcodes.isNotEmpty()) {
+ val barcode = barcodes[0]
val bounds = barcode.boundingBox
val rawValue = barcode.rawValue ?: ""
@@ -299,7 +317,7 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
@Command
fun prepare(invoke: Invoke) {
- prepareInternal(invoke.getString("cameraDirection", "back"))
+ prepareInternal(invoke.getString("cameraDirection", "back"), invoke.getBoolean("windowed", false))
cameraReady = true
invoke.resolve()
}
@@ -307,7 +325,6 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
@Command
fun cancel(invoke: Invoke) {
savedInvoke?.reject("cancelled")
- destroy()
invoke.resolve()
}
@@ -319,7 +336,8 @@ class BarcodeScannerPlugin(private val activity: Activity) : Plugin(activity),
throw Exception("No permission to use camera. Did you request it yet?")
} else {
if (!cameraReady) {
- prepareInternal(invoke.getString("cameraDirection", "back"))
+ webViewBackground = null
+ prepareInternal(invoke.getString("cameraDirection", "back"), invoke.getBoolean("windowed", false))
}
cameraReady = false
configureCamera(getFormats(invoke))
diff --git a/plugins/barcode-scanner/guest-js/index.ts b/plugins/barcode-scanner/guest-js/index.ts
index 8e119909..17fe7510 100644
--- a/plugins/barcode-scanner/guest-js/index.ts
+++ b/plugins/barcode-scanner/guest-js/index.ts
@@ -1,59 +1,83 @@
-import { invoke } from '@tauri-apps/api/tauri'
+import { invoke } from "@tauri-apps/api/tauri";
-type PermissionState = 'granted' | 'denied'
+type PermissionState = "granted" | "denied";
-type Format = 'QR_CODE' | 'UPC_A' | 'UPC_E' | 'EAN_8' | 'EAN_13' | 'CODE_39' | 'CODE_93' | 'CODE_128' | 'CODABAR' | 'ITF' | 'AZTEC' | 'DATA_MATRIX' | 'PDF_417'
+type Format =
+ | "QR_CODE"
+ | "UPC_A"
+ | "UPC_E"
+ | "EAN_8"
+ | "EAN_13"
+ | "CODE_39"
+ | "CODE_93"
+ | "CODE_128"
+ | "CODABAR"
+ | "ITF"
+ | "AZTEC"
+ | "DATA_MATRIX"
+ | "PDF_417";
interface ScanOptions {
- cameraDirection?: 'back' | 'front'
- formats?: Format[]
+ cameraDirection?: "back" | "front";
+ formats?: Format[];
+ windowed?: boolean;
}
interface PrepareOptions {
- cameraDirection?: 'back' | 'front'
+ cameraDirection?: "back" | "front";
+ windowed?: boolean;
+}
+
+interface Scanned {
+ content: string;
+ bounds: unknown;
}
/**
* Prepare the camera before starting scanning.
* This is optional, only use it if you need a small performance improvement when preparing a scan in advance.
- * @param options
+ * @param options
*/
-export async function prepare(options?: PrepareOptions) {
- invoke('plugin:barcodeScanner|prepare', { ...options })
+export async function prepare(options?: PrepareOptions): Promise
{
+ return await invoke("plugin:barcodeScanner|prepare", { ...options });
}
/**
* Start scanning.
- * @param options
+ * @param options
*/
-export async function scan(options?: ScanOptions) {
- invoke('plugin:barcodeScanner|scan', { ...options })
+export async function scan(options?: ScanOptions): Promise {
+ return await invoke("plugin:barcodeScanner|scan", { ...options });
}
/**
* Cancel the current scan process.
*/
-export async function cancel() {
- invoke('plugin:barcodeScanner|cancel')
+export async function cancel(): Promise {
+ return await invoke("plugin:barcodeScanner|cancel");
}
/**
* Get permission state.
*/
export async function checkPermissions(): Promise {
- return invoke<{ camera: PermissionState }>('plugin:barcodeScanner|check_permissions').then(r => r.camera)
+ return await invoke<{ camera: PermissionState }>(
+ "plugin:barcodeScanner|check_permissions"
+ ).then((r) => r.camera);
}
/**
* Request permissions to use the camera.
*/
export async function requestPermissions(): Promise {
- return invoke<{ camera: PermissionState }>('plugin:barcodeScanner|request_permissions').then(r => r.camera)
+ return await invoke<{ camera: PermissionState }>(
+ "plugin:barcodeScanner|request_permissions"
+ ).then((r) => r.camera);
}
/**
* Open application settings. Useful if permission was denied and the user must manually enable it.
*/
-export async function openAppSettings() {
- invoke('plugin:barcodeScanner|open_app_settings')
+export async function openAppSettings(): Promise {
+ return await invoke("plugin:barcodeScanner|open_app_settings");
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 02d03f7c..b6d93a34 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -61,6 +61,9 @@ importers:
'@zerodevx/svelte-json-view':
specifier: 0.2.1
version: 0.2.1
+ tauri-plugin-barcode-scanner-api:
+ specifier: 0.0.0
+ version: link:../../plugins/barcode-scanner
tauri-plugin-cli-api:
specifier: 0.0.0
version: link:../../plugins/cli