A maintained and fixed Cordova music controls plugin for Android, iOS, and Windows.
This plugin shows a native media notification / lockscreen controller with play, pause, next, previous buttons and supports real seek and progress updates on Android, which were missing in the original plugin.
This repository is a cleaned, fixed, and maintained fork of the original, now unmaintained plugin:
Original Repository:
https://github.com/homerours/cordova-music-controls-plugin
Original Author: homerours
The original plugin contained multiple Android issues such as:
- Seek mentioned in docs but not implemented
- Progress bar displayed but never updated
- Android 12+ BroadcastReceiver crashes
- Broken MediaSession callback lifecycle
- Duration metadata ignored on Android
β All of these issues are fixed in this fork.
Maintained & Fixed by: Merbin Joe
GitHub: https://github.com/merbin2012
Repository: https://github.com/merbin2012/cordova-codeplay-music-controls
- Android 5.0+ (MediaSession based, Android 13/14 compatible)
- iOS 8+
- Windows 10+
cordova plugin add https://github.com/merbin2012/cordova-codeplay-music-controlsnpm i cordova-codeplay-music-controlsMusicControls.create({
track : 'My Audio Track',
artist : 'CodePlay',
album : '',
cover : 'https://example.com/cover.jpg',
isPlaying : true,
dismissable : true,
hasPrev : true,
hasNext : true,
hasClose : true,
// β
REQUIRED for progress bar & seek (Android)
duration : 380, // seconds
elapsed : 10, // seconds
ticker : 'Now playing My Audio Track',
playIcon : 'media_play',
pauseIcon : 'media_pause',
prevIcon : 'media_prev',
nextIcon : 'media_next',
closeIcon : 'media_close',
notificationIcon : 'notification'
}, onSuccess, onError);
β οΈ Android Note
The progress bar and seek scrubber work only whenduration > 0is provided.
function events(action) {
// `action` is already an object
const message = action.message;
switch (message) {
case 'music-controls-play':
audio.play();
MusicControls.updateIsPlaying(true);
break;
case 'music-controls-pause':
audio.pause();
MusicControls.updateIsPlaying(false);
break;
case 'music-controls-next':
playNext();
break;
case 'music-controls-previous':
playPrevious();
break;
case 'music-controls-destroy':
stopAudio();
break;
// β
REAL SEEK SUPPORT (Android + iOS)
case 'music-controls-seek-to':
// position is in milliseconds
audio.currentTime = action.position / 1000;
// notify native layer about new position
MusicControls.updateElapsed({
elapsed : audio.currentTime * 1000,
isPlaying : !audio.paused
});
break;
}
}
MusicControls.subscribe(events);
MusicControls.listen();Android does not automatically update media progress.
You must push progress updates from JavaScript.
setInterval(() => {
if (!audio || isNaN(audio.currentTime)) return;
MusicControls.updateElapsed({
elapsed : audio.currentTime * 1000, // milliseconds
isPlaying : !audio.paused
});
}, 1000);β Keeps notification progress, lockscreen scrubber, and Bluetooth seek in sync.
MusicControls.updateIsPlaying(true);
MusicControls.updateDismissable(true);music-controls-play
music-controls-pause
music-controls-next
music-controls-previous
music-controls-toggle-play-pause
music-controls-seek-to
music-controls-stop
Also supports headset and Bluetooth media buttons.
- Android never controls audio playback directly
- JavaScript must apply seek and report progress
- This plugin correctly bridges MediaSession β JS
Avoid controlling playback in canplay.
Use:
loadedmetadataβ initializationtimeupdateβ progressseeking / seekedβ buffering UI
- β Android seek implementation
- β Moving progress bar
- β Correct duration handling
- β MediaSession callback fixes
- β BroadcastReceiver crash fixes
- β Cordova callback lifecycle fixes
- β Android 13/14 compatibility
- β Capacitor support
β Fully compatible with Capacitor + Ionic projects (tested with Capacitor & Ionic apps)
-
Original plugin by homerours
https://github.com/homerours/cordova-music-controls-plugin -
Maintained & fixed by Merbin Joe
https://github.com/merbin2012
Same license as the original project.