21467bf243ed52520ad4231dc8f03bef5350377a
URLFinder
A free, open-source Android app that detects URLs and QR codes in real time using your device camera.
Features
- 📷 Real-time camera scanning — live camera preview powered by CameraX
- 🔤 Text URL detection — recognizes URLs in any visible text using ML Kit Text Recognition
- 📲 QR code scanning — decodes QR codes that contain URLs with ML Kit Barcode Scanning
- 🔗 Clickable URLs — tap any detected URL to open it in your browser (with a safety warning)
- ⚡ Flash / torch toggle — turn on the camera torch for scanning in low-light conditions
- 🗂️ Local history — all detected URLs are saved locally and can be browsed and cleared from Settings
- ⚠️ Safety warning dialog — a confirmation dialog reminds you that URLs may be dangerous before opening
- 🆓 Free & open source — MIT licensed, no ads, no tracking, no analytics
Screenshots
Requirements
| Android version | 7.0 (API 24) or higher |
| Permissions | CAMERA, INTERNET |
| Hardware | Rear camera with autofocus recommended |
Installation
Download APK
Download the latest release APK from the Releases page and install it on your device.
You may need to enable Install from unknown sources in your device settings.
Build from source
-
Clone the repository
git clone https://github.com/manalejandro/URLFinder.git cd URLFinder -
Open in Android Studio
- File → Open → select the
URLFinderfolder - Let Gradle sync finish
- File → Open → select the
-
Run or build
./gradlew assembleDebug # APK → app/build/outputs/apk/debug/app-debug.apk
Architecture
MainActivity
└── CameraScreen (Jetpack Compose)
├── CameraViewModel
│ ├── CameraX (Preview + ImageAnalysis)
│ ├── ML Kit Text Recognition → extracts URLs from plain text
│ └── ML Kit Barcode Scanner → decodes QR codes
├── UrlResultsPanel (LazyColumn of detected URLs)
└── SettingsScreen
├── History tab (UrlHistoryRepository — SharedPreferences)
└── About tab (open-source info + GitHub link)
Key design decisions:
- Frame analysis is throttled to 800 ms to reduce CPU/battery usage.
ImageAnalysis.STRATEGY_KEEP_ONLY_LATESTdrops frames that arrive while the previous one is still being processed.- Both text and barcode analyzers run concurrently on the same frame, results are merged.
- URLs are deduplicated per session; the history avoids duplicate entries too.
- The history is stored as JSON in
SharedPreferences(no external DB dependency).
Tech stack
| Library | Version | Purpose |
|---|---|---|
| Kotlin | 2.0.21 | Programming language |
| Jetpack Compose (BOM) | 2024.09.00 | UI toolkit |
| Material 3 | — | Design system |
| CameraX | 1.4.2 | Camera access and analysis |
| ML Kit Text Recognition | 16.0.1 | URL detection in text |
| ML Kit Barcode Scanning | 17.3.0 | QR code decoding |
| Accompanist Permissions | 0.37.0 | Runtime camera permission |
| Lifecycle ViewModel Compose | 2.10.0 | State management |
Permissions
| Permission | Reason |
|---|---|
CAMERA |
Required to capture and analyze camera frames for URLs and QR codes |
INTERNET |
Required to open detected URLs in the browser |
Contributing
Contributions are welcome! Feel free to:
- Open an issue to report a bug or suggest a feature
- Fork the repo and submit a pull request
Please follow the existing code style (Kotlin + Compose conventions) and add documentation to public APIs.
License
MIT License
Copyright (c) 2026 Manuel Alejandro
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.
Made with ❤️ using Kotlin, Jetpack Compose, CameraX and ML Kit
https://github.com/manalejandro/URLFinder
Languages
Kotlin
100%
