如何在 Flutter 上使用 audio_service 使用本地化的 MediaItem 标题和专辑
How to use localized MediaItem title and album using audio_service on Flutter
我在我的 Flutter 应用程序中使用 audio_service 包。
在所有示例中,MediaItem
要么出现在从 BackgroundAudioTask
扩展的 class 中,要么从另一个 class 传递过来,但它们最后是 hard-coded..
在我的项目中,我只有一个 MediaItem
(不管播放的声音如何),我想在 MediaItem
.
中使用本地化字符串
问题是 BackgroundAudioTask
不会给你一个 BuildContext
,所以你不能从你的 BackgroundAudioTask
.
得到本地化的字符串
到目前为止,我尝试在 BackgroundAudioTask
中覆盖 onUpdateMediaItem
,如下所示:
@override
onUpdateMediaItem(MediaItem mediaItem) async {
AudioServiceBackground.setMediaItem(mediaItem);
}
并在 BackgroundAudioTask
之外设置 MediaItem,如下所示:
final mediaItem = MediaItem(
id: "my-fixed-id",
album: AppLocalizations.of(context).translate('media_item_album'),
title: AppLocalizations.of(context).translate('media_item_title'),
);
AudioService.updateMediaItem(mediaItem);
问题是我不知道将第二个代码块放在哪里。我不能把它放在我的应用程序 class 中,因为本地化还没有在那里初始化,我不确定将它放在页面屏幕中是否有意义,因为这个 MediaItem
s 用于服务而且不应该被绑在屏幕上。
你能帮我使用 MediaItem
的本地化字符串吗?
提前致谢!
我是这样解决的:
在我的后台任务中:
@override
Future<void> onUpdateMediaItem(MediaItem mediaItem) async {
AudioServiceBackground.setMediaItem(mediaItem);
}
在我的 HomePage
中,我收听了 running
事件流,获取字符串值,然后设置媒体项:
@override
void initState() {
super.initState();
_setMediaItem();
}
void _setMediaItem() {
AudioService.runningStream.listen((bool isRunning) {
if (isRunning) {
AudioService.updateMediaItem(
MediaItem(
id: "ambiance-sound-mix",
album: AppLocalizations.of(context).getString("media_item_album"),
title: AppLocalizations.of(context).getString("media_item_title"),
),
);
}
});
}
PS:
我还尝试切换到 easy_localization,认为这样可以解决问题,因为它不需要 BuildContext
来查找字符串值。然而,这不起作用,因为当您尝试从 audio_service 的 BackgroundAudioTask
获取字符串值时,EasyLocalization 失败,因为它无法使用加载的字符串访问其 instance
并尝试获取字符串来自空字符串映射..
我在我的 Flutter 应用程序中使用 audio_service 包。
在所有示例中,MediaItem
要么出现在从 BackgroundAudioTask
扩展的 class 中,要么从另一个 class 传递过来,但它们最后是 hard-coded..
在我的项目中,我只有一个 MediaItem
(不管播放的声音如何),我想在 MediaItem
.
问题是 BackgroundAudioTask
不会给你一个 BuildContext
,所以你不能从你的 BackgroundAudioTask
.
到目前为止,我尝试在 BackgroundAudioTask
中覆盖 onUpdateMediaItem
,如下所示:
@override
onUpdateMediaItem(MediaItem mediaItem) async {
AudioServiceBackground.setMediaItem(mediaItem);
}
并在 BackgroundAudioTask
之外设置 MediaItem,如下所示:
final mediaItem = MediaItem(
id: "my-fixed-id",
album: AppLocalizations.of(context).translate('media_item_album'),
title: AppLocalizations.of(context).translate('media_item_title'),
);
AudioService.updateMediaItem(mediaItem);
问题是我不知道将第二个代码块放在哪里。我不能把它放在我的应用程序 class 中,因为本地化还没有在那里初始化,我不确定将它放在页面屏幕中是否有意义,因为这个 MediaItem
s 用于服务而且不应该被绑在屏幕上。
你能帮我使用 MediaItem
的本地化字符串吗?
提前致谢!
我是这样解决的:
在我的后台任务中:
@override
Future<void> onUpdateMediaItem(MediaItem mediaItem) async {
AudioServiceBackground.setMediaItem(mediaItem);
}
在我的 HomePage
中,我收听了 running
事件流,获取字符串值,然后设置媒体项:
@override
void initState() {
super.initState();
_setMediaItem();
}
void _setMediaItem() {
AudioService.runningStream.listen((bool isRunning) {
if (isRunning) {
AudioService.updateMediaItem(
MediaItem(
id: "ambiance-sound-mix",
album: AppLocalizations.of(context).getString("media_item_album"),
title: AppLocalizations.of(context).getString("media_item_title"),
),
);
}
});
}
PS:
我还尝试切换到 easy_localization,认为这样可以解决问题,因为它不需要 BuildContext
来查找字符串值。然而,这不起作用,因为当您尝试从 audio_service 的 BackgroundAudioTask
获取字符串值时,EasyLocalization 失败,因为它无法使用加载的字符串访问其 instance
并尝试获取字符串来自空字符串映射..