MetaPi is an Android application built with Kotlin and Jetpack Compose that enables users to:
- Upload images from their device
- View and edit EXIF and IPTC metadata
- Crop and adjust photos
- Set or modify location data via Google Maps integration
- Prepare and upload images to cloud storage for use in Pi3D digital picture frames
- Tech Stack
- Architecture
- Project Structure
- Features
- Setup & Installation
- API Keys & Configuration
- Build & Deployment
- Planned Enhancements
- Language: Kotlin
- UI Framework: Jetpack Compose
- Architecture: MVVM (Model-View-ViewModel)
- EXIF Metadata Handling:
Android ExifInterface - IPTC Metadata Handling: Ashampoo/KIM (Java/Kotlin Image Metadata library)
- Maps Integration: Google Maps SDK for Android
- Maps Search Suggestions Places API
- Image Cropping: CanHub Image Cropper v4.6.0
The app follows the MVVM architecture to ensure separation of concerns:
- Model: Data classes and metadata parsing logic
- ViewModel: Holds UI state and business logic
- View (UI): Composable functions for screens and components
app/
│
├── manifests/
│ └── AndroidManifest.xml
│
├── kotlin+java/com.technolab.metapi/
│ ├── data/ # Data classes (ImageItem), EXIF parsing (ExifInterface), IPTC parsing (Ashampoo/KIM)
│ ├── model/ # Domain models for metadata
│ ├── navigation/ # Navigation graph and routes
│ ├── ui/
│ │ ├── components/ # Reusable composable UI elements
│ │ ├── screens/ # Full screen UIs (Gallery, PhotoDetails, Crop, LocationPicker)
│ │ └── theme/ # Color, typography, shapes
│ ├── util/ # Helpers (file I/O, date formatting, permissions)
│ ├── viewmodel/ # ViewModels for managing screen state
│ ├── MainActivity.kt # Entry point
│ └── MetaPiApp.kt # Composable app root
│
├── res/ # Drawables, layouts, mipmaps, strings
└── build.gradle.kts # Module Gradle build file
- Gallery Screen – Displays images from local storage, selectable for editing
- Photo Details Screen – Displays full image + metadata, allows editing of EXIF/IPTC fields
- Crop Screen – Crops images via CanHub Image Cropper
- Location Picker – Allows location selection on a map, writes to metadata
- Google Maps Integration – Map preview and location tagging
- EXIF/IPTC Parsing – Reads and writes camera + descriptive metadata via ExifInterface and Ashampoo/KIM
- Cloud Upload Preparation – Processed images ready for Pi3D frame sync
-
Clone the Repository
git clone <repo-link> cd MetaPi-Android
-
Open in Android Studio
-
Sync Gradle
- Android Studio should prompt automatically.
- Configure Google API Keys
-
Enable Maps SDK for Android and Places API in Google Cloud Console.
-
Add your API key in local.properties:
MAPS_API_KEY=your_api_key_here
- Run the App
- Select an emulator or physical device and click Run.
- Google Maps SDK for Android – Displays maps for location picking.
- Google Places API – Autocomplete and geocoding.
Security Note: Store API keys in local.properties or environment variables. Do not commit them to source control.
- Build > Generate Signed Bundle / APK
- Choose APK → Provide keystore details → Release.
- Output is in app/release/app-release.apk.
- Direct Pi3D Picture Frame integration via MQTT or cloud sync.
- Frame preview simulation.