A lightweight, privacy-aware Android camera app designed for field data collection
Features • Installation • Nextcloud Setup • Building • Contributing
Linked Camera captures high-quality photos and securely links them to your workflow with optional automatic upload to Nextcloud. Perfect for field researchers, surveyors, inspectors, and anyone collecting data in the field.
Built upon the excellent Open Camera by Mark Harman, Linked Camera extends functionality with seamless Nextcloud integration and field-optimized features while maintaining the same commitment to privacy and open source principles.
- 🌐 Nextcloud Integration: Automatic upload to your own cloud storage
- 📡 Works Offline: Queue photos when WiFi is unavailable, auto-upload when reconnected
- 🔒 Privacy First: No external data transmission except to your configured server
- 📸 Full Camera Control: Manual ISO, shutter speed, focus, white balance
- 🗺️ Geotagging: Embed GPS coordinates and compass direction in photos
- 🎯 Field Ready: Designed for real-world data collection workflows
- 🔓 Open Source: GPL v3 licensed, code available for review and contribution
The standout feature for field data collection workflows.
- ✅ Automatic Upload: Photos upload immediately after capture (when WiFi is available)
- ✅ WiFi-Only Mode: Queue photos when offline, auto-upload when WiFi reconnects
- ✅ Queue Management: Manual control to process pending uploads
- ✅ Auto-Delete: Optionally delete local photos after successful upload to save storage
- ✅ Password Protection: Support for password-protected Nextcloud public shares
- ✅ Background Service: Uploads happen in the background without interrupting workflow
- ✅ Upload Notifications: Real-time feedback on upload status and queue size
- Manual Modes: Full control over ISO, shutter speed, focus distance, white balance
- Advanced Photo Modes:
- HDR (High Dynamic Range)
- Panorama (wide-angle stitching)
- Exposure Bracketing (multiple exposures for HDR processing)
- Focus Bracketing (focus stacking for macro photography)
- Noise Reduction (multi-shot noise reduction)
- Fast Burst (rapid continuous shooting)
- RAW Support: Capture DNG (RAW) images alongside JPEG for maximum editing flexibility
- Image Formats: JPEG, WebP, PNG, Ultra HDR JPEG
- Multiple resolutions including 4K UHD support
- Configurable bitrate and frame rate
- Digital video stabilization
- Slow motion video support
- Video picture profiles (Log, Gamma, REC709, sRGB)
- Audio recording with multiple source options (camcorder, external mic, unprocessed)
- Maximum duration and file size limits
- Video subtitles with GPS and timestamp data
- GPS Coordinates: Store latitude/longitude in photo EXIF data
- Compass Direction: Store GPS compass direction in photos
- Photo Stamping: Overlay date, time, GPS coordinates, and custom text directly on photos
- Location Requirements: Optionally require GPS lock before allowing photo capture
- Customizable Format: Choose coordinate format and units
- Bluetooth LE Remote: Support for Bluetooth remote shutter devices (Kraken)
- Audio Triggers: Take photos via voice command ("cheese") or loud noise detection
- Timer & Repeat Mode: Automated time-lapse photography
- Volume Keys: Use volume buttons to take photos, zoom, or other functions
- Touch to Capture: Tap or double-tap preview to take photo
- Immersive Mode: Hide system UI for distraction-free shooting
- UI Placement: Left-handed or right-handed interface layouts
- On-Screen Information: Customizable display of zoom, ISO, battery, time, angle, GPS, etc.
- Grid & Guides: Rule of thirds, golden ratio, crop guides
- Histogram: RGB or luminance histogram overlay
- Zebra Stripes: Overexposure warning stripes
- Focus Peaking: Highlight in-focus edges for manual focus
- Go to Releases
- Download
linked-camera-v1.0.apk - On your Android device:
- Go to Settings → Security → Install unknown apps
- Enable installation for your browser or file manager
- Open the downloaded APK file
- Follow the installation prompts
- Grant required permissions when first opening the app
- Camera (required): To take photos and videos
- Storage/Files (required): To save photos and videos
- Location (optional): Only if using geotagging features
- Bluetooth (optional): Only if using Bluetooth remote control
- Microphone (optional): Only if recording video with audio or using audio triggers
- A Nextcloud server (self-hosted or provider-hosted)
- WiFi connection for initial setup and uploads (if WiFi-only mode is enabled)
- Log into Nextcloud web interface
- Navigate to the folder where you want photos uploaded
- Example:
Photos/Field WorkorDocuments/Survey Data
- Example:
- Create the folder if it doesn't exist
- Click the Share icon (🔗) next to the folder
- Under "Share link", click "Create public link"
- Enable permissions:
- ✅ Check "Allow upload and editing" (critical!)
⚠️ This allows the app to upload files to this folder
- (Optional) Set a password for added security
- Recommended if you're concerned about the share link being discovered
- Copy the share URL
- It will look like:
https://cloud.example.com/index.php/s/AbCdEfGh123456 - Save this URL - you'll need it for the app
- It will look like:
💡 Tip: Use a dedicated folder for camera uploads to keep your photos organized
-
Open Linked Camera
-
Go to Settings:
- Tap the ⚙️ Settings icon
- Navigate to "Linked Camera Settings"
- Tap "Server settings..."
-
Enable Auto-Upload:
- Toggle "Nextcloud Auto-Upload" to ON
-
Enter Share URL:
- Tap "Nextcloud Share URL"
- Paste your share URL from Step 1
- Ensure it includes the full path:
https://cloud.example.com/index.php/s/TOKEN
-
(Optional) Enter Password:
- If you set a password on the share, tap "Share Password (optional)"
- Enter the password exactly as configured in Nextcloud
-
Configure Upload Behavior:
- 📶 "WiFi Only" (recommended): Only upload when connected to WiFi
- When disabled, will use mobile data (use with caution!)
- 🗑️ "Auto-Delete After Upload": Delete local copy after successful upload
- Useful to save device storage
⚠️ Only enable if you're confident uploads are working reliably
- 📶 "WiFi Only" (recommended): Only upload when connected to WiFi
- Take a test photo
- Return to camera view and take a photo
- Check notification area:
- If WiFi is connected: Should see "Photo uploaded to Nextcloud"
- If WiFi is off (with WiFi-only enabled): "Queued for WiFi upload"
- Verify in Nextcloud:
- Open your Nextcloud folder in a web browser
- The photo should appear within a few seconds
- Filename format:
IMG_YYYYMMDD_HHMMSS.jpg
✅ Success! If you see the photo in Nextcloud, your setup is complete!
Photo Captured
↓
WiFi Check → ✅ Connected
↓
Upload to Nextcloud (WebDAV)
↓
✅ Success Notification
↓
(Optional) Delete Local Copy
Photo Captured
↓
WiFi Check → ❌ Not Connected
↓
Add to Upload Queue
↓
"Queued for WiFi upload" Notification
↓
[Later...] WiFi Reconnects → Auto-process Queue
↓
Upload All Queued Photos
↓
✅ Success Notifications
| Setting | Description | Recommendation |
|---|---|---|
| Nextcloud Auto-Upload | Master on/off toggle | ✅ Enable for field work |
| Nextcloud Share URL | Your public share link | |
| Share Password | Password for protected share | 🔒 Use for added security |
| WiFi Only | Only upload on WiFi | ✅ Enable to save mobile data |
| Auto-Delete After Upload | Delete local copy after upload | |
| Process Upload Queue | Manual queue processing | 🔧 Use if WiFi disconnects |
Check these items:
-
✅ Share URL is correct
- Must include
/index.php/s/TOKEN - Example:
https://cloud.example.com/index.php/s/AbCdEfGh123456 - ❌ Not:
https://cloud.example.com/s/AbCdEfGh123456(missing/index.php)
- Must include
-
✅ Share has upload permissions
- In Nextcloud share settings, "Allow upload and editing" must be checked
- Try uploading a test file via web browser to verify
-
✅ WiFi is connected (if WiFi-only mode is enabled)
- Check your WiFi connection
- Disable WiFi-only mode temporarily to test
-
✅ Password is correct (if share is password-protected)
- Password is case-sensitive
- No extra spaces before/after
-
✅ Nextcloud server is accessible
- Try accessing the share URL in a web browser
- Check if server is online
Check Notifications:
- Look for error messages in notification area
- Common errors: "Upload failed", "Server not reachable", "Authentication failed"
Solutions:
-
Check WiFi Connection
- Ensure WiFi is connected and working
- Try opening a website to verify internet access
-
Manually Trigger Queue
- Settings → Server settings → "Process Upload Queue"
- This forces immediate queue processing
-
Check Queue Size
- Queue size shown in notification area
- If queue is very large, processing may take time
-
Restart the App
- Close Linked Camera completely
- Reopen - queue should auto-process if WiFi is available
Common causes:
| Error Scenario | Possible Cause | Solution |
|---|---|---|
| All uploads fail | Server offline | Check Nextcloud server status |
| Intermittent failures | Network issues | Check WiFi stability, try mobile data |
| After Nextcloud update | Share permissions changed | Re-verify "Allow upload and editing" |
| Large photos fail | Server upload limits | Check Nextcloud upload size limits |
| Authentication errors | Wrong password | Re-enter share password |
For advanced troubleshooting:
- Enable Android Developer Options
- Connect via ADB:
adb logcat -s NextcloudUploadService:* ImageSaver:* - Look for error messages in the log output
- Share logs when reporting issues on GitHub
- JDK 17 or higher (JDK 21 recommended)
- Android SDK with API level 35 (Android 15)
- Gradle 8.7.3+ (wrapper included in repository)
- Git for cloning the repository
# Clone the repository
git clone https://github.com/UrbanVue/linked_camera.git
cd linked_camera
# Build debug APK
./gradlew assembleDebug
# Output location
# app/build/outputs/apk/debug/app-debug.apk
# OR build release APK (requires signing configuration)
./gradlew assembleReleaseIf you don't have Android SDK installed:
- Download Android Studio
- Install Android SDK via Android Studio
- Set
ANDROID_HOMEenvironment variable:# Linux/Mac export ANDROID_HOME=$HOME/Android/Sdk # Windows set ANDROID_HOME=C:\Users\YourName\AppData\Local\Android\Sdk
JDK version errors:
# Check your Java version
java -version
# Should show Java 17 or higher
# If not, download from: https://adoptium.net/SDK not found:
- Ensure
ANDROID_HOMEis set correctly - Or create
local.propertiesin project root:sdk.dir=/path/to/your/android/sdk
Permission denied on gradlew:
chmod +x gradlew
./gradlew assembleDebugGradle daemon issues:
./gradlew --stop
./gradlew clean assembleDebugPre-Field Setup:
- Configure Nextcloud upload with WiFi-only enabled
- Enable geotagging (Settings → Location settings)
- Configure photo stamping with your project name
- Take test photos and verify uploads
- Download test photos from Nextcloud to verify GPS data
In the Field:
- Take photos normally - they'll queue automatically
- GPS data embeds automatically (if enabled)
- Check queue count in notification area
- Photos upload when you return to WiFi
Post-Field:
- Connect to WiFi at office/home
- Photos upload automatically from queue
- Verify all uploads in Nextcloud
- Organize and process as needed
- Disable unnecessary on-screen displays (Settings → On screen GUI)
- Use WiFi-only mode (saves battery vs constant mobile data)
- Turn off geotagging if GPS data isn't needed
- Consider enabling auto-delete to reduce storage writes
- Use airplane mode in the field, enable WiFi when ready to upload
- Enable auto-delete if device storage is limited
- Monitor queue size - large queues can use significant storage
- Manually clear queue after verifying uploads: Settings → Process Upload Queue
- Check Nextcloud storage quota regularly
| Mode | Description | Use Case |
|---|---|---|
| Standard | Normal photo capture | General photography |
| HDR | High dynamic range | Scenes with varied lighting |
| Panorama | Wide-angle stitching | Landscapes, site overviews |
| Expo Bracketing | Multiple exposures | HDR post-processing |
| Focus Bracketing | Multiple focus distances | Macro, focus stacking |
| Noise Reduction | Multi-shot NR | Low light conditions |
| Fast Burst | Rapid continuous | Action shots |
- Resolutions: Up to 4K UHD (device-dependent)
- Bitrate Control: 100kbps to 200Mbps
- Frame Rate: Standard, high FPS, slow motion
- Picture Profiles: Standard, Log, Gamma, REC709, sRGB
- Audio: Multiple source options (camcorder, external mic, unprocessed)
- ISO: AUTO, 25-3200+ (device-dependent)
- Shutter Speed: 1/32000s to 30s (device-dependent)
- Focus: Auto, Continuous, Macro, Infinity, Manual
- White Balance: Auto, Daylight, Cloudy, Fluorescent, Incandescent, Manual
- Exposure Compensation: -3 to +3 EV
- Minimum: Android 5.0 (Lollipop, API 21)
- Target: Android 15 (API 35)
- Recommended: Android 8.0+ for best camera features
- Storage: ~20 MB app size
- Camera: Device with camera (front and/or back)
- Optional: GPS for geotagging, Bluetooth for remote control
Q: Is my data sent to any third parties? A: No. Linked Camera only uploads to the Nextcloud server YOU configure. There is no analytics, telemetry, or data collection of any kind.
Q: Can I use this without Nextcloud? A: Yes! Nextcloud upload is completely optional. You can use Linked Camera as a regular camera app.
Q: What happens if I lose internet connection while uploading? A: The current upload will fail, but the photo remains in the queue. It will retry when WiFi reconnects.
Q: Can I upload videos to Nextcloud? A: Currently, only JPEG images are uploaded. Video support may be added in future versions.
Q: Does this work with other cloud services (Dropbox, Google Drive)? A: No, currently only Nextcloud is supported via WebDAV public shares.
Q: Is the GPS location accurate? A: GPS accuracy depends on your device and environmental conditions. Clear sky view provides best accuracy (typically 3-10m).
Q: Can I customize the upload folder structure? A: Photos upload to the root of the configured Nextcloud share folder. You can organize them manually in Nextcloud afterward.
Q: What format are the uploaded photos? A: JPEG format. RAW/DNG files are not uploaded (only stored locally).
We welcome contributions! Whether it's bug reports, feature requests, or code contributions, please engage with the project.
Found a bug or have a feature request?
- Check existing issues
- Create a new issue with:
- Device model and Android version
- Steps to reproduce the issue
- Expected behavior vs actual behavior
- Logs if available (adb logcat)
- Screenshots if applicable
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Test thoroughly on multiple Android versions
- Follow existing code style and conventions
- Commit your changes:
git commit -m 'Add amazing feature' - Push to your branch:
git push origin feature/amazing-feature - Open a Pull Request with:
- Clear description of changes
- Reasoning for the changes
- Any related issue numbers
- Maintain compatibility with Android 5.0+
- Test on both Camera1 and Camera2 APIs
- Preserve privacy-first principles (no analytics/telemetry)
- Follow Material Design guidelines for UI
- Add comments for complex logic
- Update documentation for user-facing changes
This project is licensed under the GNU General Public License v3.0 or later.
Copyright © 2025 UrbanVue B.V.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
See LICENSE for the full license text.
Linked Camera is built upon Open Camera by Mark Harman, which is also licensed under GPL v3. We are grateful for Mark's excellent work on the core camera functionality.
- Developed by: UrbanVue B.V.
- Based on: Open Camera by Mark Harman
- License: GNU GPL v3
- Dependencies:
- AndroidX libraries (Apache License 2.0)
- Google Material Design icons (Apache License 2.0)
Thank you to all contributors who help improve Linked Camera!
- 📖 Documentation: This README and in-app help
- 🐛 Bug Reports: GitHub Issues
- 💡 Feature Requests: GitHub Issues
- 📧 Contact: Create an issue for support
Features:
- ✨ Full Open Camera feature set
- ✨ Nextcloud auto-upload with WiFi queue management
- ✨ Geotagging and photo stamping
- ✨ Field data collection optimizations
- ✨ Privacy-focused design
- ✨ Rebranded as Linked Camera for UrbanVue B.V.
Technical:
- Minimum Android 5.0 (API 21)
- Target Android 15 (API 35)
- Camera2 API support
- WebDAV-based Nextcloud integration
Made with ❤️ for field researchers, surveyors, and data collectors