flutter_mic_selector 1.0.1
flutter_mic_selector: ^1.0.1 copied to clipboard
Android microphone device discovery, selection, and persistence for Flutter.
flutter_mic_selector #
A Flutter plugin for discovering and selecting Android microphone input devices for use with compatible audio and video recording packages.
This plugin is focused solely on microphone discovery and selection. It does not record audio. Use external packages such as record for actual recording.
Features #
- List all available Android microphone input devices
- Select a microphone by device ID
- Read the currently selected microphone
- Clear the selection and restore system default routing
- Listen for microphone connection and disconnection events
- Persist the selected device ID in native Android storage
- Check and request
RECORD_AUDIOpermission
Platform Support #
| Platform | Support |
|---|---|
| Android | ✅ Supported |
| iOS | ❌ Not supported |
| Web | ❌ Not supported |
| Windows | ❌ Not supported |
| macOS | ❌ Not supported |
| Linux | ❌ Not supported |
Android Requirements #
- minSdk: 21 (Android 5.0)
- Device discovery requires API 23+ (Android 6.0) — returns empty list on older versions
- Device connection events (
AudioDeviceCallback) require API 23+
Installation #
dependencies:
flutter_mic_selector: ^0.3.0
Permission Setup #
The plugin declares android.permission.RECORD_AUDIO in its own manifest. Your app must also request this permission at runtime before using microphone features:
import 'package:flutter_mic_selector/flutter_mic_selector.dart';
final micSelector = FlutterMicSelector.instance;
if (await micSelector.hasPermission()) {
// Permission granted
} else {
final granted = await micSelector.requestPermission();
if (!granted) return; // Handle denial
}
For more control over permission flows, use the permission_handler package.
Usage #
Import #
import 'package:flutter_mic_selector/flutter_mic_selector.dart';
Listing Microphones #
final micSelector = FlutterMicSelector.instance;
final devices = await micSelector.getAvailableMicrophones();
for (final device in devices) {
print('${device.name} (${device.type.label})');
}
Selecting a Microphone #
final devices = await micSelector.getAvailableMicrophones();
if (devices.isNotEmpty) {
await micSelector.selectMicrophone(devices.first);
// or by ID:
await micSelector.selectMicrophoneById(devices.first.id);
}
Reading the Selected Microphone #
final selected = await micSelector.getSelectedMicrophone();
print(selected?.name ?? 'No device selected');
Clearing the Selection #
await micSelector.clearSelectedMicrophone();
// System default routing is restored.
Listening for Device Changes #
micSelector.microphoneDevicesChanged.listen((devices) {
print('Devices changed: ${devices.length} microphone(s) available');
});
Audio Recording Integration #
Use the record package to record audio with your selected microphone:
import 'package:record/record.dart';
final micSelector = FlutterMicSelector.instance;
// Select a microphone
await micSelector.selectMicrophoneById('some-device-id');
// Start recording (Android will route audio based on the selection)
final recorder = AudioRecorder();
await recorder.start(const RecordConfig(), path: '/path/to/output.m4a');
// ... later ...
await recorder.stop();
Note: Audio routing to the selected microphone depends on Android's audio framework. The selected device is applied as a preference, not a guaranteed route for all recorder implementations.
Video Recording Integration #
The official Flutter camera package does not expose a public microphone device parameter. Video microphone selection depends on Android audio routing and device behavior, and may not work consistently across all devices.
The plugin does not currently mux separately recorded audio and video. For synchronized A/V recording, consider using the camera package's built-in audio capture.
Model Reference #
MicrophoneDevice #
| Field | Type | Description |
|---|---|---|
id |
String |
Stable Android audio device ID |
name |
String |
User-facing display name |
type |
MicrophoneType |
Categorized device type |
isInput |
bool |
Always true for microphones |
isSelected |
bool |
Whether this is the currently selected device |
MicrophoneType #
| Value | Description |
|---|---|
builtIn |
Built-in microphone (earpiece, speaker, or mic) |
wiredHeadset |
Wired headset, headphones, or line input |
bluetooth |
Bluetooth or BLE headset microphone |
usb |
USB microphone, headset, or accessory |
telephony |
Telephony microphone |
unknown |
Unknown or unsupported input type |
Typed Exceptions #
| Exception | When thrown |
|---|---|
MicrophoneNotFoundException |
The requested device ID does not exist |
MicrophoneSelectionException |
Android rejected the selection |
MicrophonePermissionException |
RECORD_AUDIO permission is missing |
UnsupportedMicrophoneException |
Operation not supported on this platform |
Example Application #
The example/ directory contains a working application that demonstrates:
- Requesting microphone permission
- Listing available microphones
- Selecting a microphone
- Displaying selected device information
- Recording audio using the selected microphone (via
recordpackage) - Handling device connection/disconnection events
Run the example:
cd example
flutter run
Contributing #
Contributions are welcome, especially for adding support for platforms beyond Android. Please open an issue or pull request with your proposed approach.
License #
MIT