Giter Club home page Giter Club logo

quickie's Introduction

quickie logo quickie logo

quickie is a Quick Response (QR) Code scanning library for Android that is based on CameraX and ML Kit on-device barcode detection. It's an alternative to ZXing based libraries and written in Kotlin. quickie features:

  • Easy API for launching the QR scanner and receiving results by using the new Activity Result API
  • Modern design, edge-to-edge scanning view with multilingual user hint
  • Android Jetpack CameraX for communicating with the camera and showing the preview
  • ML Kit Vision API for best, fully on-device barcode recognition and decoding

Download Maven Central

There are two different flavors available on mavenCentral():

Bundled Unbundled
ML Kit model is bundled inside app (independent of Google Services) ML Kit model will be automatically downloaded via Play Services (once while installing/updating the app)
About 2.5 MB app size increase per ABI (you should use App Bundle or ABI splitting) About 550 KB app size increase
V3 model is used (faster, more accurate) Currently V1 model will be downloaded
// bundled:  
implementation("io.github.g00fy2.quickie:quickie-bundled:1.10.0")

// unbundled:
implementation("io.github.g00fy2.quickie:quickie-unbundled:1.10.0")

Quick Start

View-based

To use the QR scanner simply register the ScanQRCode() ActivityResultContract together with a callback during init or onCreate() lifecycle of your Activity/Fragment and use the returned ActivityResultLauncher to launch the QR scanner Activity.

val scanQrCodeLauncher = registerForActivityResult(ScanQRCode()) { result ->
    // handle QRResult
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    …
    binding.button.setOnClickListener { scanQrCodeLauncher.launch(null) }
}

Check out the sample inside this repo or visit the official Activity Result API documentation for more information.

Jetpack Compose

Use the rememberLauncherForActivityResult() API to register the ScanQRCode() ActivityResultContract together with a callback in your composable:

@Composable
fun GetQRCodeExample() {
    val scanQrCodeLauncher = rememberLauncherForActivityResult(ScanQRCode()) { result ->
        // handle QRResult
    }
    
    Button(onClick = { scanQrCodeLauncher.launch(null) }) {
    …
}

Check out the official Compose Activity Result documentation for more information.

Responses

The activity result is a subclass of the sealed QRResult class:

  1. QRSuccess when ML Kit successfully detected a QR code
    • wraps a QRContent object
  2. QRUserCanceled when the Activity got canceled by the user
  3. QRMissingPermission when the user didn't accept the camera permission
  4. QRError when CameraX or ML Kit threw an exception
    • wraps the exception

Content

The content type of the QR code detected by ML Kit is wrapped inside a subclass of the sealed QRContent class which always provides a rawBytes and rawValue (will only be null for non-UTF8 barcodes).

Currently, supported subtypes are: Plain, Wifi, Url, Sms, GeoPoint, Email, Phone, ContactInfo, CalendarEvent

See the ML Kit Barcode documentation for further details.

Customization

Use the ScanCustomCode() ActivityResultContract to create a configurable barcode scan. When launching the ActivityResultLauncher pass in a ScannerConfig object:

BarcodeFormat options
BarcodeFormat.FORMAT_ALL_FORMATS
BarcodeFormat.FORMAT_CODE_128
BarcodeFormat.FORMAT_CODE_39
BarcodeFormat.FORMAT_CODE_93
BarcodeFormat.FORMAT_CODABAR
BarcodeFormat.FORMAT_DATA_MATRIX
BarcodeFormat.FORMAT_EAN_13
BarcodeFormat.FORMAT_EAN_8
BarcodeFormat.FORMAT_ITF
BarcodeFormat.FORMAT_QR_CODE
BarcodeFormat.FORMAT_UPC_A
BarcodeFormat.FORMAT_UPC_E
BarcodeFormat.FORMAT_PDF417
BarcodeFormat.FORMAT_AZTEC
val scanCustomCode = registerForActivityResult(ScanCustomCode(), ::handleResult)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    …
    binding.button.setOnClickListener {
      scanCustomCode.launch(
        ScannerConfig.build {
          setBarcodeFormats(listOf(BarcodeFormat.FORMAT_CODE_128)) // set interested barcode formats
          setOverlayStringRes(R.string.scan_barcode) // string resource used for the scanner overlay
          setOverlayDrawableRes(R.drawable.ic_scan_barcode) // drawable resource used for the scanner overlay
          setHapticSuccessFeedback(false) // enable (default) or disable haptic feedback when a barcode was detected
          setShowTorchToggle(true) // show or hide (default) torch/flashlight toggle button
          setShowCloseButton(true) // show or hide (default) close button
          setHorizontalFrameRatio(2.2f) // set the horizontal overlay ratio (default is 1 / square frame)
          setUseFrontCamera(true) // use the front camera
          setKeepScreenOn(true) // keep the device's screen turned on
        }
      )
    }
}

fun handleResult(result: QRResult) {
    …

Tip

You can optionally pass in an ActivityOptionsCompat object when launching the ActivityResultLauncher to control the scanner launch animation.

Screenshots / Sample App

You can find the sample app APKs inside the release assets.

Image

Requirements

  • AndroidX
  • Min SDK 21+ (required by CameraX)
  • (Google Play Services available on the end device if using quickie-unbundled)

Contributing

See CONTRIBUTING

Thanks to everyone who contributed to quickie!

License

The MIT License (MIT)

Copyright (C) 2022 Thomas Wirth

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

quickie's People

Contributors

g00fy2 avatar justinwyer avatar renovate[bot] avatar saeed-lotfi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

quickie's Issues

half of the Camera is not visible

I had error like this

My config

  scan_yer.launch(ScannerConfig.build {
            setBarcodeFormats(listOf(io.github.g00fy2.quickie.config.BarcodeFormat.FORMAT_QR_CODE)) // set interested barcode formats
            setOverlayStringRes(R.string.qr_tara) // string resource used for the scanner overlay
            setOverlayDrawableRes(R.drawable.ic_baseline_place_24_red) // drawable resource used for the scanner overlay
            setHapticSuccessFeedback(false) // enable (default) or disable haptic feedback when a barcode was detected
            setShowTorchToggle(false) // show or hide (default) torch/flashlight toggle button
            setShowCloseButton(false) // show or hide (default) close button
            setHorizontalFrameRatio(1.2f) // set the horizontal overlay ratio (default is 1 / square frame)
            setUseFrontCamera(false) // use the front camera
            setKeepScreenOn(true)

        })

camera

toString() - Am I missing something

Hi there!

When I do -

    @OptIn(ExperimentalStdlibApi::class)
    private val scanQrCodeLauncher = registerForActivityResult(ScanQRCode()) { result ->
        val actualQrRawValue =
            result.toString().removePrefix("QRSuccess(content=Plain(rawValue=")
                .removeSuffix("))");
    }

in the result.toString() I get QRSuccess(content=Plain(rawValue=<ACTUAL_QR_CODE_VALUE>)) and then the actual qr code value, Is this expected behavior or am I missing something?

Is there a way to get the ACTUAL_QR_CODE_VALUE directly?

Single dimension barcode support

Are you planning to add support for scanning conventional 1-D barcodes?
As far as i know ML-kit supports different types of codes. It would be great to have opportunity to choose code types in ScanQrCode class.
Thanks

some error

I have some errors, when i run your examples:

Access denied finding property "vendor.camera.aux.packagelist"
Access denied finding property "vendor.camera.aux.packagelist"
Access denied finding property "persist.vendor.camera.privapp.list"
Access denied finding property "vendor.camera.hal1.packagelist"

I try fix this, but i realy dont understand how resolve this problem

used guide for fix:
https://stackoverflow.com/questions/55990262/access-denied-for-property-vendor-camera-aux-packagelist

[Improvement] Handling of unavailable model for unbundled flavor

This issue only refers to the unbundled flavor.

Current behaviour:
Normally the Play Store automatically downloads the ML Kit model when installing the app. But if for some reason the download hasn't finished before the first QR scan (or if the users clears the Play Services storage), the analyzer fails and has to trigger the download at runtime. Currently this causes the scanner to close (with a QRError result). The download will continue, so when launching the scanner again everything should work.

Improvement:
In case the model is not available and has to be downloaded, we should show a loading indicator and periodically check if the model is available to then rebind the analyzer. Unfortunately ML Kit provides no download progress listener for the default models yet.

Adaptation for easy implementation in Jetpack Compose

I would like to know if it is possible to use the library with Jetpack Compose, or if you have any approach to facilitate the implementation, or to include an example using it with this new Android Kit, currently you have indicated:

private val scanCustomCode = registerForActivityResult(ScanCustomCode(), ::showSnackbar)

For Jetpack Compose it would probably look like this:

val result = remember { mutableStateOf<QRResult?>(null) }
val launcher = rememberLauncherForActivityResult(ScanCustomCode()) {
    result.value = it
}

Thank you very much in advance for your work with this library

Minimum SDK version - 31

When I pull quickie into my project I get the following error:
The minCompileSdk (31) specified in a
dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
is greater than this module's compileSdkVersion (android-28).

The intro page indicates a minimum SDK of 21+
This looks to be due to the CameraView component.

I'm going to look to move to 31 - but I thought I'd mention it here.

Many thanks for your work so far.

Failed to open the camera in mode: "Do Not Disturb"

I don't know if there will be any clear solution for this kind of errors, but in some devices with API Level 28 the camera cannot be accessed when the device is in "Do Not Disturb" mode, in this case according to Firebase, the device model for help is R15 Pro of OPPO brand

Caused by java.util.concurrent.ExecutionException: sx2: p60: w40: Some API 28 devices cannot access the camera when the device is in "Do Not Disturb" mode. The camera will not be accessible until "Do Not Disturb" mode is disabled.
       at androidx.concurrent.futures.AbstractResolvableFuture.getDoneValue(AbstractResolvableFuture.java:518)
       at androidx.concurrent.futures.AbstractResolvableFuture.get(AbstractResolvableFuture.java:475)
       at androidx.concurrent.futures.CallbackToFutureAdapter$SafeFuture.get(CallbackToFutureAdapter.java:199)
       at androidx.camera.core.impl.utils.futures.FutureChain.get(FutureChain.java:155)
       at androidx.camera.core.impl.utils.futures.ChainingListenableFuture.get(ChainingListenableFuture.java:105)
       at io.github.g00fy2.quickie.QRScannerActivity.startCamera$lambda-5(QRScannerActivity.java:88)
       at com.google.android.exoplayer2.video.VideoRendererEventListener$EventDispatcher$$InternalSyntheticLambda$1$1fd5b85d7b8d7fe3fd17f83c26e057a0b1efab8c89366a128fb356de74f064f9$0.run$bridge(VideoRendererEventListener.java:43)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:232)
       at android.app.ActivityThread.main(ActivityThread.java:7240)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:883)

[Crash] Calling from Java

Hello and thanks for this library, saved me a ton of work.

I am trying to provide a custom builder to the launcher but I get an internal exception.
Not sure if I am doing something wrong or else.

Here is the relevant code (Java):

private final ActivityResultLauncher barCodeScannerLauncher = this.registerForActivityResult(new ScanQRCode(), (ActivityResultCallback<QRResult>) result -> onQrCodeScannerResponse(result));;
...
`
ScannerConfig.Builder configBuilder = new ScannerConfig.Builder();

// It works with null, it crashed with custom builder
// barCodeScannerLauncher.launch(null);
barCodeScannerLauncher.launch(configBuilder
.setBarcodeFormats(Arrays.asList(BarcodeFormat.FORMAT_QR_CODE))
.setOverlayStringRes(R.string.activity_main_press_back)
.setHapticSuccessFeedback(true)
.setShowTorchToggle(false)
.build());
`

And this is the crash:

--------- beginning of crash 2021-08-06 12:41:40.631 7758-7758/io.sensoria.motus.watch E/AndroidRuntime: FATAL EXCEPTION: main Process: io.sensoria.motus.watch, PID: 7758 java.lang.RuntimeException: Unable to resume activity {io.sensoria.motus.watch/io.sensoria.motus.activities.QrCodeScannerActivity}: java.lang.ClassCastException: io.github.g00fy2.quickie.config.ScannerConfig cannot be cast to java.lang.Void at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3845) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3877) at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6865) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.ClassCastException: io.github.g00fy2.quickie.config.ScannerConfig cannot be cast to java.lang.Void at io.github.g00fy2.quickie.ScanQRCode.createIntent(ScanQRCode.kt:17) at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:168) at androidx.activity.result.ActivityResultRegistry$2.launch(ActivityResultRegistry.java:162) at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47) at io.sensoria.motus.activities.QrCodeScannerActivity.lambda$onMandatoryPermissionsGranted$5$QrCodeScannerActivity(QrCodeScannerActivity.java:261) at io.sensoria.motus.activities.-$$Lambda$QrCodeScannerActivity$RmJSyqq0dqwqYcz7r9d_u2pyywY.run(Unknown Source:2) at android.app.Activity.runOnUiThread(Activity.java:7752) ... other part of the stack not relevant

I am calling from UI thread.

[Feature Request] View based implementation to allow embedding

Currently the library relies on a Scanner Activity to handle the permission, camera setup, lifecycles and analysis on its own.

For advanced integration (e.g. intercepting the result value or adding a custom overlay) it would be necessary to allow embedding the scanner as a view. See #10.

How to get wifi ssid or another information?

This is the method provided in google MLKit
case Barcode.TYPE_WIFI:
String ssid = barcode.getWifi().getSsid();
String password = barcode.getWifi().getPassword();
int type = barcode.getWifi().getEncryptionType();
break;
case Barcode.TYPE_URL:
String title = barcode.getUrl().getTitle();
String url = barcode.getUrl().getUrl();
break;
How can I use this method in this project?

java.util.concurrent.ExecutionException when initial camera

Crash log as below:

Caused by java.util.concurrent.ExecutionException: w.s0: java.lang.IllegalStateException: Failed to register a camera service listener
       at androidx.concurrent.futures.AbstractResolvableFuture.getDoneValue(AbstractResolvableFuture.java:518)
       at androidx.concurrent.futures.AbstractResolvableFuture.get(AbstractResolvableFuture.java:475)
       at androidx.concurrent.futures.CallbackToFutureAdapter$SafeFuture.get(CallbackToFutureAdapter.java:199)
       at androidx.camera.core.impl.utils.futures.FutureChain.get(FutureChain.java:157)
       at androidx.camera.core.impl.utils.futures.ChainingListenableFuture.get(ChainingListenableFuture.java:107)
       at io.github.g00fy2.quickie.QRScannerActivity.startCamera$lambda$5(QRScannerActivity.java:88)
       at androidx.camera.core.ProcessingImageReader$$InternalSyntheticLambda$4$dbaec4db6246f9a70463e1ad230a0f23052441fbc13c08a22670d4bb6101a731$0.run$bridge(ProcessingImageReader.java:68)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7397)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

Caused by w.s0: java.lang.IllegalStateException: Failed to register a camera service listener
       at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$2(CameraX.java:373)
       at androidx.camera.core.CameraX$$InternalSyntheticLambda$5$845f10987ef598ac292769067d92d63fd4aa661f29de3bb3ed47d03f5eaa76ed$0.run(CameraX.java:292)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)

Caused by java.lang.IllegalStateException: Failed to register a camera service listener
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.connectCameraServiceLocked(CameraManager.java:1023)
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.getCameraIdList(CameraManager.java:1037)
       at android.hardware.camera2.CameraManager.getCameraIdList(CameraManager.java:111)
       at androidx.camera.camera2.internal.compat.CameraManagerCompatBaseImpl.getCameraIdList(CameraManagerCompatBaseImpl.java:58)
       at androidx.camera.camera2.internal.compat.CameraManagerCompat.getCameraIdList(CameraManagerCompat.java:98)
       at androidx.camera.camera2.internal.CameraSelectionOptimizer.getSelectedAvailableCameraIds(CameraSelectionOptimizer.java:49)
       at androidx.camera.camera2.internal.Camera2CameraFactory.<init>(Camera2CameraFactory.java:69)
       at androidx.camera.camera2.Camera2Config$$InternalSyntheticLambda$1$b737bf8082c5f7ea267385a154eefca2640a55b974e0d2599d3c3cd43ba9dca3$0.newInstance(Camera2Config.java:2)
       at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$2(CameraX.java:312)
       at androidx.camera.core.CameraX$$InternalSyntheticLambda$5$845f10987ef598ac292769067d92d63fd4aa661f29de3bb3ed47d03f5eaa76ed$0.run(CameraX.java:54)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)

Caused by android.os.ServiceSpecificException: addListenerHelper:1811: Listener already registered
       at android.os.Parcel.createException(Parcel.java:2085)
       at android.os.Parcel.readException(Parcel.java:2039)
       at android.os.Parcel.readException(Parcel.java:1987)
       at android.hardware.ICameraService$Stub$Proxy.addListener(ICameraService.java:639)
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.connectCameraServiceLocked(CameraManager.java:1016)
       at android.hardware.camera2.CameraManager$CameraManagerGlobal.getCameraIdList(CameraManager.java:1037)
       at android.hardware.camera2.CameraManager.getCameraIdList(CameraManager.java:111)
       at androidx.camera.camera2.internal.compat.CameraManagerCompatBaseImpl.getCameraIdList(CameraManagerCompatBaseImpl.java:58)
       at androidx.camera.camera2.internal.compat.CameraManagerCompat.getCameraIdList(CameraManagerCompat.java:98)
       at androidx.camera.camera2.internal.CameraSelectionOptimizer.getSelectedAvailableCameraIds(CameraSelectionOptimizer.java:49)
       at androidx.camera.camera2.internal.Camera2CameraFactory.<init>(Camera2CameraFactory.java:69)
       at androidx.camera.camera2.Camera2Config$$InternalSyntheticLambda$1$b737bf8082c5f7ea267385a154eefca2640a55b974e0d2599d3c3cd43ba9dca3$0.newInstance(Camera2Config.java:2)
       at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$2(CameraX.java:312)
       at androidx.camera.core.CameraX$$InternalSyntheticLambda$5$845f10987ef598ac292769067d92d63fd4aa661f29de3bb3ed47d03f5eaa76ed$0.run(CameraX.java:54)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)

Crash on Android 9.1 smart watch

Hello.
I am trying to use the library on an Android 9.1 smart watch.
When the code makes the call where the breakpoint is currently set (QRScannerActivity.kt:87):

image

the internals of the library will start barfing exception stacks in logcat and eventually crash the application.
The watch has a dual camera, and I am successfully using the library on another dual camera watch with Android 9 (not sure that the version is the reason, but mentioning anyway).

This is the logcat dump. Any idea is welcome...

2021-11-04 16:18:29.837 4502-4604/io.sensoria.motus.watch W/CameraX: Retry init. Start time 234185466 current time 234185660
    java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
2021-11-04 16:18:29.864 4502-4571/io.sensoria.motus.watch I/gralloc: gralloc_register_buffer hnd=0x7d68a91040, share_fd=91, share_attr_fd=-1, magic=51647890, format=1, internal_format=1, byte_stride=960, flags=4, usage=0xb00, size=50880, width=240, height=53, internalWidth=240, internalHeight=53, stride=240, base=0x7d5340a000, writeOwner=0, attr_base=0xffffffffffffffff, yuv_info=1, fd=-1, buf_idx=0, offset=0, min_pgsz=4096, phyaddr=0
2021-11-04 16:18:29.874 4502-4571/io.sensoria.motus.watch I/gralloc: gralloc_register_buffer hnd=0x7d68a91880, share_fd=92, share_attr_fd=-1, magic=51647890, format=1, internal_format=1, byte_stride=1600, flags=4, usage=0xb00, size=640000, width=400, height=400, internalWidth=400, internalHeight=400, stride=400, base=0x7d51cbf000, writeOwner=0, attr_base=0xffffffffffffffff, yuv_info=1, fd=-1, buf_idx=0, offset=0, min_pgsz=4096, phyaddr=0
2021-11-04 16:18:30.390 4502-4605/io.sensoria.motus.watch D/CameraRepository: Added camera: 0
2021-11-04 16:18:30.402 4502-4605/io.sensoria.motus.watch W/CameraX: Retry init. Start time 234185466 current time 234186222
    java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
2021-11-04 16:18:30.959 4502-4604/io.sensoria.motus.watch D/CameraRepository: Added camera: 0
2021-11-04 16:18:30.968 4502-4604/io.sensoria.motus.watch W/CameraX: Retry init. Start time 234185466 current time 234186789
    java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
2021-11-04 16:18:31.514 4502-4605/io.sensoria.motus.watch D/CameraRepository: Added camera: 0
2021-11-04 16:18:31.522 4502-4605/io.sensoria.motus.watch W/CameraX: Retry init. Start time 234185466 current time 234187344
    java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
2021-11-04 16:18:32.081 4502-4604/io.sensoria.motus.watch D/CameraRepository: Added camera: 0
2021-11-04 16:18:32.089 4502-4604/io.sensoria.motus.watch W/CameraX: Retry init. Start time 234185466 current time 234187911
    java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
2021-11-04 16:18:32.645 4502-4605/io.sensoria.motus.watch D/CameraRepository: Added camera: 0
2021-11-04 16:18:32.657 4502-4605/io.sensoria.motus.watch W/CameraX: CameraX initialize() failed
    androidx.camera.core.InitializationException: java.nio.BufferUnderflowException
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:632)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
2021-11-04 16:18:32.662 4502-4502/io.sensoria.motus.watch D/AndroidRuntime: Shutting down VM


2021-11-04 16:18:32.672 4502-4502/io.sensoria.motus.watch E/AndroidRuntime: FATAL EXCEPTION: main
    Process: io.sensoria.motus.watch, PID: 4502
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
     Caused by: java.util.concurrent.ExecutionException: androidx.camera.core.InitializationException: java.nio.BufferUnderflowException
        at androidx.concurrent.futures.AbstractResolvableFuture.getDoneValue(AbstractResolvableFuture.java:518)
        at androidx.concurrent.futures.AbstractResolvableFuture.get(AbstractResolvableFuture.java:475)
        at androidx.concurrent.futures.CallbackToFutureAdapter$SafeFuture.get(CallbackToFutureAdapter.java:199)
        at androidx.camera.core.impl.utils.futures.FutureChain.get(FutureChain.java:155)
        at androidx.camera.core.impl.utils.futures.ChainingListenableFuture.get(ChainingListenableFuture.java:105)
        at io.github.g00fy2.quickie.QRScannerActivity.startCamera$lambda-5(QRScannerActivity.kt:87)
        at io.github.g00fy2.quickie.QRScannerActivity.lambda$-YPR5sJr3fvd3r2wXus03U7rQDI(Unknown Source:0)
        at io.github.g00fy2.quickie.-$$Lambda$QRScannerActivity$-YPR5sJr3fvd3r2wXus03U7rQDI.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6865)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
     Caused by: androidx.camera.core.InitializationException: java.nio.BufferUnderflowException
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:632)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:515)
        at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:111)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:45)
        at android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean.unmarshal(MarshalQueryableBoolean.java:32)
        at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:404)
        at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
        at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
        at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:73)
        at androidx.camera.camera2.internal.TorchControl.<init>(TorchControl.java:79)
        at androidx.camera.camera2.internal.Camera2CameraControlImpl.<init>(Camera2CameraControlImpl.java:181)
        at androidx.camera.camera2.internal.Camera2CameraImpl.<init>(Camera2CameraImpl.java:205)
        at androidx.camera.camera2.internal.Camera2CameraFactory.getCamera(Camera2CameraFactory.java:74)
        at androidx.camera.core.impl.CameraRepository.init(CameraRepository.java:64)
        at androidx.camera.core.CameraX.lambda$initAndRetryRecursively$9$CameraX(CameraX.java:596)
        at androidx.camera.core.-$$Lambda$CameraX$u-Xx2b6YXY5GXNXRh-mDiDnHdpQ.run(Unknown Source:10) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 

Occasional crash on Pixel 5 Android 13

Integrate with: implementation("io.github.g00fy2.quickie:quickie-bundled:1.5.1")

Crash log:

Fatal Exception: java.lang.IllegalStateException: MlKitContext has not been initialized
       at com.google.android.gms.common.internal.Preconditions.checkState(com.google.android.gms:play-services-basement@@18.1.0:2)
       at com.google.mlkit.common.sdkinternal.MlKitContext.getInstance(com.google.mlkit:common@@18.5.0:1)
       at com.google.mlkit.vision.barcode.BarcodeScanning.getClient(BarcodeScanning.java:3)
       at io.github.g00fy2.quickie.QRCodeAnalyzer$barcodeScanner$2.invoke(QRCodeAnalyzer.kt:24)
       at io.github.g00fy2.quickie.QRCodeAnalyzer$barcodeScanner$2.invoke(QRCodeAnalyzer.kt:18)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at io.github.g00fy2.quickie.QRCodeAnalyzer.getBarcodeScanner(QRCodeAnalyzer.kt:18)
       at io.github.g00fy2.quickie.QRCodeAnalyzer.analyze(QRCodeAnalyzer.kt:42)
       at androidx.camera.core.ImageAnalysis$$ExternalSyntheticLambda2.b(R8$$SyntheticClass:3)
       at androidx.camera.core.ImageAnalysisAbstractAnalyzer.lambda$analyzeImage$0(ImageAnalysisAbstractAnalyzer.java:285)
       at androidx.camera.core.ImageAnalysisAbstractAnalyzer$$InternalSyntheticLambda$8$864b24cc058c102b9ababe9f2eaf5f45916e7a7a0663a2b450741580c02ea23e$0.run(ImageAnalysisAbstractAnalyzer.java:66)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
       at java.lang.Thread.run(Thread.java:1012)

[Feature Request] Configure to Keep the Screen On

Currently I need the screen to keep turned On when I'm in the scanner, the solution I have currently and is not my favorite is with a Wakelock,
Will be nice to configure a flag FLAG_KEEP_SCREEN_ON because flags only live in the activity that they are added, so from the activity where the scanners is called will not work with the scanner

Barcode Scanning is not working on Devices Managed by MDM-Android

Barcode Scanning is not working on Devices Managed by MDM-Android

We have using MLKit for Bar code and QR code Scanning, But one of our Customer have disabled the Play services on their devices, and Barcode scanning is not working.

Is there any way we can support ML Kit Barcode on the devices where there are no Google Play services installed?

Can i get the code where if the Play services not supported how to use ML Kit

[crash] drawable resource crash - common problem on android api 21

its common problem on android api 21, can be solved by adding res pngs for this android version

Caused by android.content.res.Resources$NotFoundException: File res/drawable/quickie_bg_torch.xml from drawable resource ID #0x7f0802d1
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2590)
at android.content.res.Resources.loadDrawable(Resources.java:2487)
at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
at android.view.View.(View.java:3745)
at android.widget.ImageView.(ImageView.java:139)
at android.widget.ImageView.(ImageView.java:135)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieTorchImageviewBinding.inflate(QuickieTorchImageviewBinding.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieScannerActivityBinding.inflate(QuickieScannerActivityBinding.java:1)
at io.github.g00fy2.quickie.QRScannerActivity.onCreate(QRScannerActivity.java:1)
at android.app.Activity.performCreate(Activity.java:6052)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2441)
at android.app.ActivityThread.access$800(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5431)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

Caused by android.content.res.Resources$NotFoundException: File res/color/quickie_bg_torch_color_selector.xml from color state list resource ID #0x7f06014e
at android.content.res.Resources.loadColorStateList(Resources.java:2703)
at android.content.res.TypedArray.getColorStateList(TypedArray.java:427)
at android.graphics.drawable.GradientDrawable.updateGradientDrawableSolid(GradientDrawable.java:1296)
at android.graphics.drawable.GradientDrawable.inflateChildElements(GradientDrawable.java:1180)
at android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:1019)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1128)
at android.graphics.drawable.LayerDrawable.inflateLayers(LayerDrawable.java:204)
at android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:145)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1128)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1032)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2575)
at android.content.res.Resources.loadDrawable(Resources.java:2487)
at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
at android.view.View.(View.java:3745)
at android.widget.ImageView.(ImageView.java:139)
at android.widget.ImageView.(ImageView.java:135)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieTorchImageviewBinding.inflate(QuickieTorchImageviewBinding.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieScannerActivityBinding.inflate(QuickieScannerActivityBinding.java:1)
at io.github.g00fy2.quickie.QRScannerActivity.onCreate(QRScannerActivity.java:1)
at android.app.Activity.performCreate(Activity.java:6052)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2441)
at android.app.ActivityThread.access$800(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5431)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

Caused by android.content.res.Resources$NotFoundException: Resource ID #0x7f060150 type #0x2 is not valid
at android.content.res.Resources.getColor(Resources.java:976)
at android.content.res.ColorStateList.inflate(ColorStateList.java:228)
at android.content.res.ColorStateList.createFromXmlInner(ColorStateList.java:152)
at android.content.res.ColorStateList.createFromXml(ColorStateList.java:131)
at android.content.res.Resources.loadColorStateList(Resources.java:2699)
at android.content.res.TypedArray.getColorStateList(TypedArray.java:427)
at android.graphics.drawable.GradientDrawable.updateGradientDrawableSolid(GradientDrawable.java:1296)
at android.graphics.drawable.GradientDrawable.inflateChildElements(GradientDrawable.java:1180)
at android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:1019)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1128)
at android.graphics.drawable.LayerDrawable.inflateLayers(LayerDrawable.java:204)
at android.graphics.drawable.LayerDrawable.inflate(LayerDrawable.java:145)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1128)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1032)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2575)
at android.content.res.Resources.loadDrawable(Resources.java:2487)
at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
at android.view.View.(View.java:3745)
at android.widget.ImageView.(ImageView.java:139)
at android.widget.ImageView.(ImageView.java:135)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at androidx.appcompat.widget.AppCompatImageView.(AppCompatImageView.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieTorchImageviewBinding.inflate(QuickieTorchImageviewBinding.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at io.github.g00fy2.quickie.QROverlayView.(QROverlayView.java:8)
at java.lang.reflect.Constructor.newInstance(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at io.github.g00fy2.quickie.databinding.QuickieScannerActivityBinding.inflate(QuickieScannerActivityBinding.java:1)
at io.github.g00fy2.quickie.QRScannerActivity.onCreate(QRScannerActivity.java:1)
at android.app.Activity.performCreate(Activity.java:6052)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2441)
at android.app.ActivityThread.access$800(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5431)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

Size of preview camera

Hi, it's not issue. I'm wondering how to change the square in preview camera to rectangle, or just dynamic size.

Thank you

Can i have my own custom design in place of QROverlayView

Instead of showing a square box in scanning screen, i want to add my own custom design. Is it possible using this library ?
Anyways, you said because of the limitations of ML kit, now entire screen image is captured, not just the square box. Then why not allow us to have custom design for Scanning screen ?

Crash on certain devices

Related to #21 (could not reopen that one)

I worked with the Android team to fix the internal issue related to this.
however, your library is using a previous version of the CameraX implementation.

Could you upgrade to

androidx.camera:camera-*:1.2.0-alpha01?

thanks

[Question] Customization of the scanner behavior

Hello there!

The lib works like a charm, the only difficulty we faced is that it's impossible to customize behavior of the scanner.

For instance, we'd like to implement additional check of QR code right in the QRScannerActivity
to avoid finishing the activity while the scanning result does not meet certain criteria.

Obviously, forking the project is an option, but maybe you can recommend something else?

Request removing `<uses-feature android:name="android.hardware.camera"/>`

Add <uses-feature android:name="android.hardware.camera"/> in AndroidManifest.xml by default will cause app which integrated this library won't be able to be installed on devices without camera hardware.

Sometime QRCode scanning function is not the core function of the app and camera hardware should not be required.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

This repository currently has no open or pending branches.

Detected dependencies

github-actions
.github/workflows/build.yml
  • actions/checkout v3
  • actions/setup-java v3
  • actions/checkout v3
  • actions/setup-java v3
  • actions/checkout v3
  • actions/setup-java v3
  • actions/checkout v3
  • actions/setup-java v3
gradle
gradle.properties
settings.gradle.kts
build.gradle.kts
gradle/libs.versions.toml
  • androidx.appcompat:appcompat 1.6.1
  • androidx.camera:camera-camera2 1.2.3
  • androidx.camera:camera-lifecycle 1.2.3
  • androidx.camera:camera-view 1.2.3
  • androidx.core:core-ktx 1.10.1
  • com.google.mlkit:barcode-scanning 17.1.0
  • com.google.android.gms:play-services-mlkit-barcode-scanning 18.2.0
  • com.google.android.material:material 1.9.0
  • org.junit.jupiter:junit-jupiter-api 5.10.0
  • org.junit.jupiter:junit-jupiter-engine 5.10.0
  • io.gitlab.arturbosch.detekt:detekt-formatting 1.23.0
  • com.android.application 8.0.2
  • com.android.library 8.0.2
  • org.jetbrains.kotlin.android 1.9.0
  • org.jetbrains.kotlin.plugin.parcelize 1.9.0
  • org.jetbrains.dokka 1.8.20
  • io.gitlab.arturbosch.detekt 1.23.0
quickie/build.gradle.kts
sample/build.gradle.kts
gradle-wrapper
gradle/wrapper/gradle-wrapper.properties
  • gradle 8.2.1

  • Check this box to trigger a request for Renovate to run again on this repository

Facing issue on get code

fun handleResult(result: QRResult) {
Toast.makeText(activity,result.content.rawValue,Toast.LENGTH_SHORT).show()
}

content.rawValue, not found

dep: implementation("io.github.g00fy2.quickie:quickie-unbundled:1.6.0")

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.