Current section

Files

Jump to
dala lib dala hardware scanner.ex
Raw

lib/dala/hardware/scanner.ex

defmodule Dala.Hardware.Scanner do
@compile {:nowarn_undefined, [:Nx]}
@moduledoc """
QR code and barcode scanner.
Requires `:camera` permission (request via `Dala.Permissions.request/2`).
Opens a full-screen camera preview. When a code is detected the view dismisses
automatically and the result is delivered to `handle_info`:
handle_info({:scan, :result, %{type: :qr, value: "https://..."}}, socket)
handle_info({:scan, :cancelled}, socket)
iOS: `AVCaptureMetadataOutput`. Android: `CameraX` + ML Kit `BarcodeScanning`.
> **Android dependency:** add to `app/build.gradle`:
> `implementation 'com.google.mlkit:barcode-scanning:17.2.0'`
> `implementation 'androidx.camera:camera-camera2:1.3.0'`
> `implementation 'androidx.camera:camera-lifecycle:1.3.0'`
> `implementation 'androidx.camera:camera-view:1.3.0'`
"""
@type format ::
:qr
| :ean13
| :ean8
| :code128
| :code39
| :upca
| :upce
| :pdf417
| :aztec
| :data_matrix
@doc """
Open the barcode scanner.
Options:
- `formats: [format]` — list of barcode formats to detect (default `[:qr]`)
"""
@spec scan(Dala.Ui.Socket.t(), keyword()) :: Dala.Ui.Socket.t()
def scan(socket, opts \\ []) do
formats = Keyword.get(opts, :formats, [:qr]) |> Enum.map(&Atom.to_string/1)
formats_json = :json.encode(formats)
Dala.Platform.Native.scanner_scan(formats_json)
socket
end
end