{"id":18961683,"url":"https://github.com/yoonit-labs/android-yoonit-camera","last_synced_at":"2025-04-19T11:41:03.409Z","repository":{"id":46599525,"uuid":"294444955","full_name":"Yoonit-Labs/android-yoonit-camera","owner":"Yoonit-Labs","description":"The most advanced and modern Camera module for Android with a lot of awesome features","archived":false,"fork":false,"pushed_at":"2021-10-04T13:18:13.000Z","size":16403,"stargazers_count":55,"open_issues_count":2,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-29T07:22:40.171Z","etag":null,"topics":["android","camera","hacktoberfest","kotlin"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yoonit-Labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-10T15:12:15.000Z","updated_at":"2024-06-10T12:31:06.000Z","dependencies_parsed_at":"2022-08-27T08:40:27.472Z","dependency_job_id":null,"html_url":"https://github.com/Yoonit-Labs/android-yoonit-camera","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yoonit-Labs%2Fandroid-yoonit-camera","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yoonit-Labs%2Fandroid-yoonit-camera/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yoonit-Labs%2Fandroid-yoonit-camera/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yoonit-Labs%2Fandroid-yoonit-camera/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yoonit-Labs","download_url":"https://codeload.github.com/Yoonit-Labs/android-yoonit-camera/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249195415,"owners_count":21228193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","camera","hacktoberfest","kotlin"],"created_at":"2024-11-08T14:14:01.816Z","updated_at":"2025-04-16T04:32:56.361Z","avatar_url":"https://github.com/Yoonit-Labs.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eAndroid Yoonit Camera\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/v/tag/Yoonit-Labs/android-yoonit-camera?color=lightgrey\u0026label=version\u0026style=for-the-badge\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/github/v/release/Yoonit-Labs/android-yoonit-facefy?color=lightgrey\u0026label=Facefy\u0026style=for-the-badge\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/github/license/Yoonit-Labs/android-yoonit-camera?color=lightgrey\u0026style=for-the-badge\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/github/v/release/Yoonit-Labs/android-yoonit-facefy?color=lightgrey\u0026label=Facefy\u0026style=for-the-badge\"/\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\u003ctable\u003e\n\t\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd align=\"left\" valign=\"middle\"\u003e\n\t\t\t\t\t\u003cp\u003e◻ Modern Android Camera API \u003ca href=\"https://developer.android.com/training/camerax\"\u003eCamera X\u003c/a\u003e\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Camera preview (Front \u0026 Back)\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ \u003ca href=\"https://github.com/Yoonit-Labs/android-yoonit-facefy\"\u003eYoonit Facefy\u003c/a\u003e integration\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ \u003ca href=\"https://pytorch.org/mobile/home\"\u003ePyTorch\u003c/a\u003e integration\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Computer vision pipeline\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Face detection, capture and image crop\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Understanding of the human face\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Frame capture\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ Capture timed images\u003c/p\u003e\n\t\t\t\t\t\u003cp\u003e◻ QR Code scanning\u003c/p\u003e\n\t\t\t\t\u003c/td\u003e\n\t\t\t\t\u003ctd align=\"center\" valign=\"middle\"\u003e\n\t\t\t\t\t\u003cimg src=\"https://raw.githubusercontent.com/Yoonit-Labs/android-yoonit-camera/main/facefy.gif\" width=\"300\" /\u003e\n\t\t\t\t\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\u003ctbody\u003e\n\t\u003c/table\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\u003ch3\u003eSponsors\u003c/h3\u003e\n\t\u003ctable\u003e\n\t\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\n\t\t\t\t\t\u003cb\u003ePlatinum\u003c/b\u003e\n\t\t\t\t\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd align=\"center\" valign=\"middle\"\u003e\n\t\t\t\t\t\u003ca href=\"https://cyberlabs.ai\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/Yoonit-Labs/android-yoonit-camera/main/sponsor_cyberlabs.png\" width=\"300\" /\u003e\u003c/a\u003e\n\t\t\t\t\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\u003c/tbody\u003e\n\t\u003c/table\u003e\n\t\u003ch5\u003e\u003ca href=\"mailto:about@yoonit.dev\"\u003eBecome a sponsor!\u003c/a\u003e\u003c/h5\u003e\n\u003c/div\u003e\n\n## Table of Contents\n\n* [Installation](#installation)\n* [Usage](#usage)\n  * [Camera Preview](#camera-preview)\n  * [Start capturing face images](#start-capturing-face-images)\n  * [Start scanning QR Codes](#start-capturing-face-images)\n* [API](#api)\n  * [Variables](#variables)\n  * [Methods](#methods)\n  * [Events](#events)\n    * [Face Analysis](#face-analysis)\n    * [Head Movements](#head-movements)\n    * [Image Quality](#image-quality)\n  * [KeyError](#keyerror)\n  * [Message](#message)\n* [To contribute and make it better](#to-contribute-and-make-it-better)\n\n## Installation\n\nAdd the JitPack repository to your root `build.gradle` at the end of repositories\n\n```groovy\nallprojects {\n\trepositories {\n\t..\n\tmaven { url 'https://jitpack.io' }\n\t}\n}\n```\n\nAdd the dependency\n\n```groovy\ndependencies {\n\timplementation 'com.github.Yoonit-Labs:android-yoonit-camera:master-SNAPSHOT'\n}\n```\n\n\n## Usage\n\nAll the functionalities that the `android-yoonit-camera` provides is accessed through the `CameraView`, that includes the camera preview.  Below we have the basic usage code, for more details, see the [**API**](#api) section.\n\n\n### Camera Preview\n\nDo not forget request camera permission. Use like this in the your layout XML:\n\n```kotlin\n\u003cai.cyberlabs.yoonit.camera.CameraView\n  android:id=\"@+id/camera_view\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\" /\u003e\n```\n\nAnd inside your code:\n\n```kotlin\nvar cameraView: CameraView\nthis.cameraView = camera_view\nthis.cameraView.startPreview()\n```\n\n### Start capturing face images\n\nWith camera preview, we can start capture detected face and generate images:\n\n```kotlin\nthis.cameraView.startCaptureType(\"face\")\n```\n\nSet camera event listener to get the result:\n\n```kotlin\nthis.cameraView.setCameraEventListener(this.buildCameraEventListener())\n..\nfun buildCameraEventListener(): CameraEventListener = object : CameraEventListener {\n..\n\toverride fun onImageCaptured(\n        type: String,\n        count: Int,\n        total: Int,\n        imagePath: String,\n        inferences: ArrayList\u003cPair\u003cString, FloatArray\u003e\u003e,\n        darkness: Double,\n        lightness: Double,\n        sharpness: Double\n    ) {\n        // YOU CODE\n    }\n\n    override fun onFaceDetected(\n        x: Int,\n        y: Int,\n        width: Int,\n        height: Int,\n        leftEyeOpenProbability: Float?,\n        rightEyeOpenProbability: Float?,\n        smilingProbability: Float?,\n        headEulerAngleX: Float,\n        headEulerAngleY: Float,\n        headEulerAngleZ: Float\n    ) {\n        // YOU CODE\n    }\n..\n}\n```\n\n### Start scanning QR Codes\n\nWith camera preview, we can start scanning QR codes:\n\n```kotlin\nthis.cameraView.startCaptureType(\"qrcode\")\n```\n\nSet camera event listener to get the result:\n\n```kotlin\nthis.cameraView.setCameraEventListener(this.buildCameraEventListener())\n..\nfun buildCameraEventListener(): CameraEventListener = object : CameraEventListener {\n..\n    override fun onQRCodeScanned(content: String) {\n        // YOUR CODE\n    }\n..\n}\n```\n\n## API\n\n### Variables\n\n| Variable                  | Type              | Default Value | Description\n| -                         | -                 |  -            | -\n| detectionTopSize          | Float             | '0.0f'        | Represents the percentage. Positive value enlarges and negative value reduce the top side of the detection. Use the `setDetectionBox` to have a visual result.\n| detectionRightSize        | Float             | '0.0f'        | Represents the percentage. Positive value enlarges and negative value reduce the right side of the detection. Use the `setDetectionBox` to have a visual result.\n| detectionBottomSize       | Float             | '0.0f'        | Represents the percentage. Positive value enlarges and negative value reduce the bottom side of the detection. Use the `setDetectionBox` to have a visual result.\n| detectionLeftSize         | Float             | '0.0f'        | Represents the percentage. Positive value enlarges and negative value reduce the left side of the detection. Use the `setDetectionBox` to have a visual result.\n| ComputerVision.enable     | Boolean           | `false        | Enable/disable computer vision usage.\n| ComputerVision.modelPaths | ArrayList\u003cString\u003e | `[]`          | The computer vision model paths.\n| ComputerVision.inputSize  | Size              | `(0, 0)`      | Image input size to use the loaded model paths.\n\n### Methods\n\n| Function                     | Parameters                                      | Valid values                                                                     | Return Type | Description\n| -                            | -                                               | -                                                                                | -           | -\n| startPreview                 | -                                               | -                                                                                | void        | Start camera preview if has permission.\n| startCaptureType             | `captureType: String`                           | \u003cul\u003e\u003cli\u003e`\"none\"`\u003c/li\u003e\u003cli\u003e`\"face\"`\u003c/li\u003e\u003cli\u003e`\"qrcode\"`\u003c/li\u003e\u003cli\u003e`\"frame\"`\u003c/li\u003e\u003c/ul\u003e | void        | Set capture type none, face, QR Code or frame.\n| stopCapture                  | -                                               | -                                                                                | void        | Stop any type of capture.\n| destroy                      | -                                               | -                                                                                | void        | Destroy camera preview.\n| toggleCameraLens             | -                                               | -                                                                                | void        | Set camera lens facing front or back.\n| setCameraLens                | `cameraLens: String`                            | \u003cul\u003e\u003cli\u003e`\"front\"`\u003c/li\u003e\u003cli\u003e`\"back\"`\u003c/li\u003e\u003c/ul\u003e                                     | void        | Set camera to use \"front\" or \"back\" lens. Default value is \"front\".\n| getCameraLens                | -                                               | -                                                                                | Int         | Return `Int` that represents lens face state: 0 for front 1 for back camera.\n| setNumberOfImages            | `numberOfImages: Int`                           | Any positive `Int` value.                                                        | void        | Default value is 0. For value 0 is saved infinity images. When saved images reached the \"number os images\", the `onEndCapture` is triggered.\n| setTimeBetweenImages         | `timeBetweenImages: Long`                       | Any positive number that represent time in milli seconds.                        | void        | Set saving face/frame images time interval in milli seconds.\n| setOutputImageWidth          | `width: Int`                                    | Any positive `number` value that represents in pixels.                           | void        | Set face image width to be created in pixels.\n| setOutputImageHeight         | `height: Int`                                   | Any positive `number` value that represents in pixels.                           | void        | Set face image height to be created in pixels.\n| setSaveImageCaptured         | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Set to enable/disable save image when capturing face and frame.\n| setDetectionBox              | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Set to enable/disable detection box when face/qrcode detected. The detection box is the the face/qrcode bounding box normalized to UI.\n| setDetectionBoxColor         | `alpha: Int, red: Int, green: Int, blue: Int`   | Value between `0` and `1`.                                                       | void        | Set detection box ARGB color. Default value is `(100, 255, 255, 255)`.\n| setDetectionMinSize          | `minimumSize: Float`                            | Value between `0` and `1`. Represents the percentage.                            | void        | Set face/qrcode minimum size to detect in percentage related with the camera preview.\n| setDetectionMaxSize          | `maximumSize: Float`                            | Value between `0` and `1`. Represents the percentage.                            | void        | Set face/qrcode maximum size to detect in percentage related with the camera preview.\n| setFaceContours              | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Set to enable/disable face contours when face detected.\n| setFaceContoursColor         | `alpha: Int, red: Int, green: Int, blue: Int`   | Positive value between 0 and 255.                                                | void        | Set face contours ARGB color. Default value is `(100, 255, 255, 255)`.\n| setROI                       | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Enable/disable the region of interest capture.\n| setROITopOffset              | `topOffset: Float`                              | Value between `0` and `1`. Represents the percentage.                            | void        | Camera preview top distance in percentage.\n| setROIRightOffset            | `rightOffset: Float`                            | Value between `0` and `1`. Represents the percentage.                            | void        | Camera preview right distance in percentage.\n| setROIBottomOffset           | `bottomOffset: Float`                           | Value between `0` and `1`. Represents the percentage.                            | void        | Camera preview bottom distance in percentage.\n| setROILeftOffset             | `leftOffset: Float`                             | Value between `0` and `1`. Represents the percentage.                            | void        | Camera preview left distance in percentage.\n| setROIAreaOffset             | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Set to enable/disable region of interest offset visibility.\n| setROIAreaOffsetColor        | `alpha: Int, red: Int, green: Int, blue: Int`   | Any positive integer between 0 and 255.                                          | void        | Set face region of interest area offset color. Default value is `(100, 255, 255, 255)`.\n| setBlurFaceDetectionBox      | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Enable/disable blur in face detection box.\n| setColorEncodingCapture      | `colorEncoding: String`                         | \u003cul\u003e\u003cli\u003e`\"RGB\"`\u003c/li\u003e\u003cli\u003e`\"YUV\"`\u003c/li\u003e                                             | void        | Set the color encoding for the saved images.\n| setTorch                     | `enable: Boolean`                               | `true` or `false`.                                                               | void        | Set to enable/disable the device torch. Available only to camera lens `\"back\"`.\n| ComputerVision.clear         | -                                               | -                                                                                | void        | Clear computer vision model paths.\n\n### Events\n\n| Event              | Parameters                                                                                                                                                                                                     | Description\n| -                  | -                                                                                                                                                                                                              | -\n| onImageCaptured    | `type: String, count: Int, total: Int, imagePath: String, inferences: ArrayList\u003cPair\u003cString, FloatArray\u003e\u003e, darkness: Double, lightness: Double, sharpness: Double`                                             | Must have started capture type of face/frame (see `startCaptureType`). Emitted when the image file is created: \u003cul\u003e\u003cli\u003etype: '\"face\"' or '\"frame\"'\u003c/li\u003e\u003cli\u003ecount: current index\u003c/li\u003e\u003cli\u003etotal: total to create\u003c/li\u003e\u003cli\u003eimagePath: the image path\u003c/li\u003e\u003cli\u003einferences: each array element is the image inference result.\u003c/li\u003e\u003cli\u003edarkness: image darkness classification.\u003c/li\u003e\u003cli\u003elightness: image lightness classification.\u003c/li\u003e\u003cli\u003esharpness: image sharpness classification.\u003c/li\u003e\u003cul\u003e\n| onFaceDetected     | `x: Int, y: Int, width: Int, height: Int, leftEyeOpenProbability: Float?, rightEyeOpenProbability: Float?, smilingProbability: Float?, headEulerAngleX: Float, headEulerAngleY: Float, headEulerAngleZ: Float` | Must have started capture type of face. Emit the [face analysis](#face-analysis).\n| onFaceUndetected   | -                                                                                                                                                                                                              | Must have started capture type of face. Emitted after `onFaceDetected`, when there is no more face detecting.\n| onEndCapture       | -                                                                                                                                                                                                              | Must have started capture type of face/frame. Emitted when the number of image files created is equal of the number of images set (see the method `setNumberOfImages`).\n| onQRCodeScanned    | `content: String`                                                                                                                                                                                              | Must have started capture type of qrcode (see `startCaptureType`). Emitted when the camera scan a QR Code.\n| onError            | `error: String`                                                                                                                                                                                                | Emit message error.\n| onMessage          | `message: String`                                                                                                                                                                                              | Emit message.\n| onPermissionDenied | -                                                                                                                                                                                                              | Emit when try to `startPreview` but there is not camera permission.\n\n#### Face Analysis\n\nThe face analysis is the response send by the `onFaceDetected`. Here we specify all the parameters.\n\n| Attribute               | Type     | Description |\n| -                       | -        | -           |\n| x                       | `Int`    | The `x` position of the face in the screen. |\n| y                       | `Int`    | The `y` position of the face in the screen. |\n| width                   | `Int`    | The `width` position of the face in the screen. |\n| height                  | `Int`    | The `height` position of the face in the screen. |\n| leftEyeOpenProbability  | `Float?` | The left eye open probability. |\n| rightEyeOpenProbability | `Float?` | The right eye open probability. |\n| smilingProbability      | `Float?` | The smiling probability. |\n| headEulerAngleX         | `Float`  | The angle in degrees that indicate the vertical head direction. See [Head Movements](#headmovements) |\n| headEulerAngleY         | `Float`  | The angle in degrees that indicate the horizontal head direction. See [Head Movements](#headmovements) |\n| headEulerAngleZ         | `Float`  | The angle in degrees that indicate the tilt head direction. See [Head Movements](#headmovements) |\n\n#### Head Movements\n\nHere we explaining the above gif and how reached the \"results\". Each \"movement\" (vertical, horizontal and tilt) is a state, based in the angle in degrees that indicate head direction;\n\n| Head Direction | Attribute         |  _v_ \u003c -36° | -36° \u003c _v_ \u003c -12° | -12° \u003c _v_ \u003c 12° | 12° \u003c _v_ \u003c 36° |  36° \u003c _v_  |\n| -              | -                 | -           | -                 | -                | -               | -           |\n| Vertical       | `headEulerAngleX` | Super Down  | Down              | Frontal          | Up              | Super Up    |\n| Horizontal     | `headEulerAngleY` | Super Left  | Left              | Frontal          | Right           | Super Right |\n| Tilt           | `headEulerAngleZ` | Super Right | Right             | Frontal          | Left            | Super Left  |\n\n### Image Quality\n\nThe image quality is the classification of the three attributes: darkness, lightness and sharpness. Result available in the `onImageCaptured` event. Let's see each parameter specifications:\n\n| Threshold           | Classification\n| -                   | -\n| **Darkness**        |\n| darkness \u003e 0.7  \t  | Too dark\n| darkness \u003c= 0.7     | Acceptable\n| **Lightness**       |\n| lightness \u003e 0.65    | Too light\n| lightness \u003c= 0.65   | Acceptable\n| **Sharpness**       |\n| sharpness \u003e= 0.1591 | Blurred\n| sharpness \u003c 0.1591  | Acceptable\n\n### KeyError\n\nPre-define key error constants used by the `onError` event.\n\n| KeyError                             | Description\n| -                                    | -\n| INVALID_CAPTURE_TYPE                 | Tried to start a non-existent capture type.\n| INVALID_CAMERA_LENS                  | Tried to input invalid camera lens.\n| INVALID_NUMBER_OF_IMAGES             | Tried to input invalid face/frame number of images to capture.\n| INVALID_TIME_BETWEEN_IMAGES          | Tried to input invalid face time interval to capture face.\n| INVALID_OUTPUT_IMAGE_WIDTH           | Tried to input invalid image width.\n| INVALID_OUTPUT_IMAGE_HEIGHT          | Tried to input invalid image height.\n| INVALID_DETECTION_BOX_COLOR          | Tried to input invalid detection box ARGB value color.\n| INVALID_MINIMUM_SIZE                 | Tried to input invalid minimum size.\n| INVALID_MAXIMUM_SIZE                 | Tried to input invalid maximum size.\n| INVALID_FACE_CONTOURS_COLOR          | Tried to input invalid face contour ARGB value color.\n| INVALID_ROI_TOP_OFFSET               | Tried to input invalid region of interest top offset.\n| INVALID_ROI_RIGHT_OFFSET             | Tried to input invalid region of interest right offset.\n| INVALID_ROI_BOTTOM_OFFSET            | Tried to input invalid region of interest bottom offset.\n| INVALID_ROI_LEFT_OFFSET              | Tried to input invalid region of interest left offset.\n| INVALID_ROI_COLOR                    | Tried to input invalid region of interest area offset ARGB value color.\n| INVALID_IMAGE_CAPTURE_COLOR_ENCODING | Tried to input invalid image capture color encoding.\n| INVALID_COMPUTER_VISION_MODEL_PATHS  | Tried to input a non existent computer vision model paths.\n\n### Message\n\nPre-define message constants used by the `onMessage` event.\n\n| Message                  | Description\n| -                        | -\n| INVALID_MINIMUM_SIZE     | Face/QRCode width percentage in relation of the screen width is less than the set (`setDetectionMinSize`).\n| INVALID_MAXIMUM_SIZE     | Face/QRCode width percentage in relation of the screen width is more than the set (`setDetectionMaxSize`).\n| INVALID_OUT_OF_ROI       | Face bounding box is out of the set region of interest (`setROI`).\n| INVALID_TORCH_LENS_USAGE | Torch not available with camera lens \"front\" (`setTorch`).\n\n## To contribute and make it better\n\nClone the repo, change what you want and send PR.\nFor commit messages we use \u003ca href=\"https://www.conventionalcommits.org/\"\u003eConventional Commits\u003c/a\u003e.\n\nContributions are always welcome!\n\n\u003ca href=\"https://github.com/Yoonit-Labs/android-yoonit-camera/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=Yoonit-Labs/android-yoonit-camera\" /\u003e\n\u003c/a\u003e\n\n---\n\nCode with ❤ by the [**Yoonit**](https://yoonit.dev/) Team\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoonit-labs%2Fandroid-yoonit-camera","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoonit-labs%2Fandroid-yoonit-camera","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoonit-labs%2Fandroid-yoonit-camera/lists"}