📞 Caller Announcer (Flutter + Kotlin)
Caller Announcer is a Flutter app that automatically announces incoming calls in Amharic using Android Text-to-Speech (TTS).
It can speak the caller’s name if the contact exists or read the phone number digit by digit if unknown.
🚀 Features
🔊 Announces incoming calls in Amharic
👤 Reads contact names (if saved in Contacts)
🔢 Speaks phone numbers digit by digit
🗣️ Uses Android Text-to-Speech (TTS)
🔐 Handles permissions automatically
⚙️ Built with Flutter (Frontend) and Kotlin (Native Android Integration)
🎛️ Simple UI for testing and checking service status
🧩 Project Structure
caller_announcer/
├── lib/
│ └── main.dart # Flutter UI + MethodChannel calls
└── android/
└── app/src/main/kotlin/com/example/caller_announcer/
└── MainActivity.kt # Kotlin code for TTS + Call detection
🖥️ Flutter UI Overview (main.dart)
The Flutter app provides a simple control interface with:
Status indicators – Service active/inactive, permissions granted/required
Last caller info – Displays the last announced number or contact
Test Announcement button – Manually trigger a test announcement
Check Status button – Refresh TTS and permission status
Information card – Shows how the app works
Flutter communicates with Kotlin using a MethodChannel named:
static const platform = MethodChannel('caller_announcer');
Available Methods
announceCaller → Announces a given number or contact name
checkTTS → Checks if Text-to-Speech is initialized and ready
⚙️ Android Integration (MainActivity.kt)
The Kotlin code handles:
Permission requests
READ_PHONE_STATE
READ_CONTACTS
READ_CALL_LOG (Android Q+)
Text-to-Speech (TTS)
Initializes in Amharic (Locale("am", "ET"))
Falls back to English if Amharic data is missing
Prompts user to install Amharic voice data if needed
Call detection
Listens to phone state changes via TelephonyManager
When a call is RINGING:
Gets caller name (if in contacts)
Speaks name or phone number in Amharic
Handles “no …