MediaNotification 媒体通知扩展:管理媒体播放器通知,支持播放控制

MediaNotification 媒体通知扩展

下载

.aix拓展文件:

de.ullisroboterseite.ursai2medianotification.aix

.aia示例文件:

UrsMediaNotification_3_1.aia

版本历史

版本 修改内容
1.0 (2021-05-05) 初始版本
1.1 (2021-07-11) - 移除了 GetDurationGetDurationString。改用 UrsMediaHelper 扩展
- 添加了从 UrsMediaHelper 组件获取元数据的 SetMetaDataFromMH 方法
- GetAppDataDirGetDownloadDir 返回的目录以 “/” 结尾
1.2 (2021-09-12) 如果扩展在多个应用程序中使用,点击操作按钮会同时在所有应用程序中触发相关事件。这是因为使用的广播接收器的全局性质。解决方案:操作按钮的意图使用应用程序名称个性化。接收到广播时,会检查名称并只处理适当的消息。
Kodular现在也提供许多Androidx功能。只需要集成 “androidx.media.jar”。
前台服务现在通过源代码中的 UsesServices 注解和生成的.aix文件中的 broadcastReceivers 部分手动声明。
有了这些更改,不再需要为App Inventor和Kodular提供两个不同版本的扩展。

适应现有Kodular项目:
内部名称相同。因此可以用新版本替换旧版本。但这只能通过导出项目并重新导入来完成。
1. 创建项目备份副本
2. 导出项目
3. 在.aia文件(是一个ZIP存档)中,在 assets/external_comps 目录中删除 de.ullisroboterseite.ursai2medianotificationk 目录
4. 将 de.ullisroboterseite.ursai2medianotification 目录从扩展(.aix文件,也是ZIP存档)复制到.aia文件的此位置
5. 将项目(.aia文件)重新导入Kodular
1.3 (2021-09-15) 同上。现在点击通知和删除通知也使用个性化意图,以防止在多个应用程序中同时使用扩展时出现重叠。
1.4 (2022-10-10) 适配SDK31(Android 12):所有 PendingIntents 获得 FLAG_IMMUTABLE 标志
1.5 (2025-04-05) 适配SDK34(Android 14):
- 请求 POST_NOTIFICATIONS 权限
- MediaSession 优先在前台服务中运行,这需要 FOREGROUND_SERVICE_MEDIA_PLAYBACK 权限

⚠️ 注意:媒体通知的显示取决于制造商。并非每个制造商都以相同的方式实现此通知的显示。也不能保证所有功能都可用。

测试结果

非常感谢 Anke (Body Mind Power) 提供了许多宝贵的提示并花费大量时间广泛测试扩展!

设备 测试结果 视图 紧凑视图
智能手机
Redmi 5 Plus
Android 8.1
Companion版本2.6.1导致错误。Companion中并非所有必要的类都可用。
编译的APK工作完美(没有进度条,这仅从Android 10开始可用)。
Redmi 5 Plus 没有紧凑视图
智能手机
Google Pixel 2 XL
Android 11
Companion和APK都按预期工作。 Google Pixel 2XL Google Pixel 2 XL 紧凑
智能手机
Samsung A02s
Android 12
Companion和APK都按预期工作。 Samsung A02s Samsung A02s 紧凑
平板
Yestel T13_EEA
Android 13
Companion和APK都按预期工作。 Yestel 平板 Yestel 平板 紧凑
智能手机
ZTE Blade A73
Android 13
Companion和APK中都没有显示进度条。应用图标始终显示为SmallIcon(任务栏中的图标)。
其他功能按预期工作。
ZTE Blade A73 ZTE Blade A73 紧凑
智能手机
Motorola g15
Android 15
Companion和APK都按预期工作。 Motorola g15 没有紧凑视图

使用方法

自API级别21(LolliPop 5.0)以来,有一种特殊类型的通知专门开发用于控制媒体播放器。外部播放设备如耳机也可以通过此通知控制媒体播放器。

Android 10媒体通知

此扩展仅用于管理媒体通知。如果要创建常规通知,应使用 UrsAI2Notifier 扩展。

版本依赖性

显示和功能随着时间多次改变。

配置通知所需的 MediaSession 类自Android 5.0(Android Lollipop,SDK 21)开始可用。

Android 10(SDK 29)添加了显示进度条(ProgressBar)的选项。

Android 13(SDK 33)再次完全修订了外观和感觉。紧凑视图被废除。

并非所有制造商都实现了所有更改。

关于通知通道

自API级别26(版本Oreo 8.0)以来,Android引入了通知通道概念,在某些设备上也称为通知类别。从API级别26开始,所有通知必须分配给此类通道。直到API Level 25,所有与通知通道相关的信息和功能都被忽略。

通知概念相当复杂。Android允许在设备级别、通道级别以及通知本身进行设置。

通知的许多属性,例如重要性(参见Importance、IMPORTANCE_DEFAULT等),都在通道级别定义。这些属性由应用程序在创建通道时设置。借助Android应用程序设置,用户对大多数通道属性拥有完全访问权限,可以根据需要修改它们。用户进行的修改不应被覆盖。这就是为什么通道属性以后不能通过程序更改的原因。即使删除通道然后再次创建,它也是使用最后的设置创建的。”擦除”实际上只是”隐藏”。只有属性 NameDescription 以后可以更改。否则无法消除拼写错误。

因此应仔细考虑将哪些属性分配给通道。

扩展提供 ChannelIDChannelNameChannelDescriptionChannelImportance 作为通道属性。ChannelImportence定义了显示通知的条件等。通道在首次调用 ShowNotification 时自动创建。

如果要更改其他属性,必须使用新通道(新的ChannelID)。启动应用程序时应使用 HideChannel 隐藏现有通道。

保持设备活动

许多媒体播放器组件使用WakeLock在播放声音文件时保持设备活动。这在旧版本中就足够了。自Android 8.0(Oreo,API level 26)以来,Android政策已更改为阻止设备切换到待机模式(doze mode)的应用程序必须向用户明显指示这一点。从那时起,除了WakeLock外,还必须启动ForegroundService。此服务意味着通知用户电池优化正在被阻止。

KeepAppAlive 属性可用于设置扩展在显示通知时启动前台服务并设置WakeLock。这可以防止设备切换到睡眠模式。

如果通知启动前台服务,DeleteAble 属性通常没有效果。通知无法删除。

配置

⚠️ 注意:所有更改都没有立即效果。它们在下次调用 ShowNotification 时应用。

媒体通知内的按钮

在较新的Android版本中,通知通常以紧凑模式显示。在紧凑模式下,最多可以显示三个按钮。在扩展模式下,有五个(参见测试结果部分的截图)

带有播放(▶)或暂停(⏸)符号的按钮始终显示。显示哪个按钮可以使用 SetStatePaused(显示▶)和 SetStatePlaying(显示⏸)方法设置。

根据应用程序想要支持的功能,其他按钮可以通过 Support... 函数打开和关闭。

在紧凑模式下,暂停或播放按钮始终可见。ShowNavigtionButtonsInCompactView 属性可用于指定如果激活,倒带和快进按钮对也会显示。ShowSkipButtonsInCompactView 导致显示SkipToNext和SkipToPrevious。

可以使用 SetActionIcon 方法自定义通知按钮上显示的图标。可以指定系统图标的名称或上传图形文件的名称。例如,PreviousNext 的图标可以替换为 LikeDislike。总共,通知最多可以显示五个操作按钮。

激活事件

如果设置了 DeleteAble,用户可以通过例如滑动删除通知。如果通知被用户删除,则触发 UserCanceled 事件。

元数据和外观

背景颜色无法通过编程调整。它由Android自动从专辑图像颜色确定。

媒体通知背景

SetMetaDataSetMetaDataEx 函数可用于指定将在通知上显示的标题、艺术家和图像(AlbumImage)。

AlbumImage

可以按如下方式指定AlbumImage:

类型 前缀 示例
URL http 或 https https://ullisroboterseite.de/android-AI2-MediaNotification/MediaNotification.png
Asset // 或无 //MediaNotification.png 或简单地 MediaNotification.png
文件,相对路径 / /data/user/0/appinventor.ai_bienonline.UrsMediaNotificationAI2/MediaNotification.png
文件,绝对路径 file:/// file:///Android/data/appinventor.ai_bienonline.UrsMediaNotificationAI2/MediaNotification.png

指定URL时,请注意图像是同步加载的。对于大文件或慢速连接,这可能需要一些时间。另一个选择是使用支持文件异步(并发)下载的扩展(例如ImageLoader扩展)。

为简化文件访问,可以使用:

  • GetVolumes:获取卷根目录的列表
  • GetAppDataDir:获取应用程序特定数据目录的路径
  • GetDownloadDir:获取下载目录的路径
Small Icon

从API Level 23(Android 6,Marshmallow)开始,可以使用为SmallIcon(SmallIconImage 属性)包含自定义图形的选项。SmallSystemIcon 属性允许为旧版本选择系统图标(可能的选项参见:系统通知图标)。选择规则如下:

API Level SmallIconImage SmallSystemIcon 选择
≥ 23 指定 X SmallIconImage
≥ 23 指定 SmallSystemIcon
≥ 23 无图标
< 23 X 指定 SmallSystemIcon
< 23 X 无图标

图标的显示因设备和Android版本而异。最好使用单色图像(颜色深度1位)和大小256 x256像素²的JPEG或PNG格式。GIF格式的图形也可以,只要不是动画的。

ProgressBar(自Android 10,API Level 29)

自Android 10以来,媒体通知可以显示进度条和搜索条。为此,必须知道媒体对象的持续时间和播放器的当前位置。

带进度条的媒体通知

SetMetaDataEx 允许指定播放时间,这是显示进度条所必需的。一些媒体播放器,如TaifunPlayer(在示例中使用)提供此信息。要获取必要信息,播放器必须相应地初始化。

ShowWithProgressBar 函数显示进度条。它从 CurrentPosition 参数指定的位置开始。然后它继续独立运行。如果以编程方式更改播放位置,必须使用 ShowWithProgressBar 同步进度条。

对于早于Android 10的版本,SetMetaDataExShowWithProgressBar 也可以工作,但不显示进度条。

操作方法

设置组件的初始属性,传输媒体元数据(SetMetaDataSetMetaDataEx),然后调用 ShowNotificationShowWithProgressBar。从现在开始,您实际上需要对事件做出反应。根据事件,适当地设置媒体播放器,调整组件的属性并再次调用 ShowNotification

通常媒体播放器不仅由媒体通知控制。应用程序还包含应该控制播放器的控件。为了使项目中的块简单,有 PlayPauseRewind 等函数,它们触发与通知相同的事件。因此用户界面控件不需要双倍的代码。您只需调用适当的函数。

错误处理

错误通过 Screen.ErrorOccurred 事件报告。

代码 文本 含义 注释
17500 Album image not found. 无法加载指定的专辑图像。 受影响的函数是 SetMetaDataSetMetaDataEx
17501 SmallSystemIcon invalid. SmallSystemIcon 参数的规范无法解析。 受影响的函数是 ShowNotification。通知没有图标显示。
17502 SmallIconImage invalid. SmallIconImage 参数的图形文件无法加载。 受影响的函数是 ShowNotification。通知没有图标显示。
17503 Image file name invalid. IconName 参数无法解析。 受影响的函数是 SetActionIcon。符号未更改。
17504 ActioNo invalid. 操作号必须在1..6范围内。 受影响的函数是 SetActionIcon。没有符号更改。
17505 Not an UrsMediaHelper component. 指定的组件不是UrsMediaHelper类型。 受影响的函数是 SetMetaDataFromMH

参考

属性 Properties

通道描述 ChannelDescription
用户可见的NotificationChannel的描述。此属性以后可以更改。
通道ID ChannelID
NotificationChannel的ID(以后不能更改)。
通道重要性 ChannelImportance
NotificationChannel的重要性级别(1-5)。定义显示通知的条件等。
通道名称 ChannelName
用户可见的NotificationChannel的名称。此属性以后可以更改。
当前位置 CurrentPosition
当前播放位置(毫秒)。用于进度条显示。
可删除 DeleteAble
如果设置为true,用户可以删除通知,例如通过滑动。
保持应用活跃 KeepAppAlive
设置此属性为true时,扩展在显示通知时启动前台服务并设置WakeLock。
紧凑视图显示导航按钮 ShowNavigationButtonsInCompactView
如果设置为true,在紧凑视图中显示倒带和快进按钮。
紧凑视图显示跳转按钮 ShowSkipButtonsInCompactView
如果设置为true,在紧凑视图中显示SkipToNext和SkipToPrevious按钮。
小图标图片 SmallIconImage
指定用作SmallIcon的上传图像文件的名称。从API Level 23开始可用。
小系统图标 SmallSystemIcon
指定用作SmallIcon的系统图标资源名称。

事件 Events

快进 FastForward()
当用户按下快进按钮时触发。
下一个 Next()
当用户按下下一个按钮时触发。
暂停 Pause()
当用户按下暂停按钮时触发。
播放 Play()
当用户按下播放按钮时触发。
上一个 Previous()
当用户按下上一个按钮时触发。
倒带 Rewind()
当用户按下倒带按钮时触发。
跳转到 SeekTo(位置)
当用户在进度条上拖动时触发。参数表示新的位置(毫秒)。
停止 Stop()
当用户按下停止按钮时触发。
用户取消 UserCanceled()
当用户删除通知时触发。

方法 Methods

获取应用数据目录 GetAppDataDir()
获取应用程序特定数据目录的路径。
获取下载目录 GetDownloadDir()
获取下载目录的路径。
获取卷 GetVolumes()
获取卷根目录的列表。
隐藏通道 HideChannel()
隐藏通知通道。
初始化 Initialize()
初始化扩展。
通知是否活动 IsNotificationActive()
返回通知是否活动。
暂停 Pause()
暂停媒体播放器。触发Pause事件。
播放 Play()
开始媒体播放器。触发Play事件。
倒带 Rewind()
倒带媒体播放器。触发Rewind事件。
设置元数据 SetMetaData(标题,艺术家,专辑图像)
设置媒体元数据。
设置扩展元数据 SetMetaDataEx(标题,艺术家,专辑图像,持续时间)
设置扩展的媒体元数据,包括持续时间(用于进度条)。
从MediaHelper设置元数据 SetMetaDataFromMH(媒体助手组件)
从UrsMediaHelper组件获取并设置元数据。
设置暂停状态 SetStatePaused()
设置播放器状态为暂停。
设置播放状态 SetStatePlaying()
设置播放器状态为播放中。
显示通知 ShowNotification()
显示媒体通知。
显示带进度条的通知 ShowWithProgressBar(当前位置)
显示带进度条的媒体通知。
停止 Stop()
停止媒体播放器。触发Stop事件。
支持快进 SupportFastForward(启用)
启用或禁用快进按钮。
支持下一个 SupportNext(启用)
启用或禁用下一个按钮。
支持暂停 SupportPause(启用)
启用或禁用暂停按钮。
支持播放 SupportPlay(启用)
启用或禁用播放按钮。
支持上一个 SupportPrevious(启用)
启用或禁用上一个按钮。
支持倒带 SupportRewind(启用)
启用或禁用倒带按钮。
支持跳转到 SupportSeekTo(启用)
启用或禁用进度条拖动功能。
支持跳转到下一个 SupportSkipToNext(启用)
启用或禁用跳转到下一个按钮。
支持跳转到上一个 SupportSkipToPrevious(启用)
启用或禁用跳转到上一个按钮。
支持停止 SupportStop(启用)
启用或禁用停止按钮。

示例

用户界面

示例用户界面

控件

控件类型 名称 功能
按钮 btnSelect 选择音频文件
按钮 btnPlay 播放/暂停音频
按钮 btnStop 停止音频
按钮 btnFF 快进
按钮 btnRew 倒带
滑块 sldPosition 显示和控制播放位置
标签 lblStatus 显示当前状态
标签 lblTitle 显示当前标题
标签 lblArtist 显示当前艺术家
TaifunPlayer Player1 媒体播放器组件
MediaNotification MediaNotification1 媒体通知扩展

选项

  • 文件选择:可以选择本地音频文件
  • 播放控制:完整的播放、暂停、停止、快进、倒带控制
  • 进度控制:通过滑块控制播放位置
  • 通知集成:与Android媒体通知完全集成
  • 元数据显示:显示标题、艺术家和专辑图片

实现提示

  1. 初始化:在Screen.Initialize中初始化MediaNotification组件
  2. 元数据设置:使用SetMetaDataEx设置完整的元数据信息
  3. 进度同步:定期更新CurrentPosition以保持进度条同步
  4. 事件处理:处理所有MediaNotification事件以保持播放器状态一致
  5. 清理:在Screen.Uninitialize中清理通知

原文链接

原版英文文档:Ullis Roboter Seite - AI2 MediaNotification

相关参考

文档反馈