7***@qq.com
7***@qq.com
  • 发布:2026-01-24 20:47
  • 更新:2026-01-24 20:49
  • 阅读:13

大佬们救命:关于音频播放的锁屏控制问题

分类:uni-app

我们开发了一个音频播放器app,用的是uniapp的播放组件。找了几个人开发插件锁屏控制插件,兼容性都不好(有些手机可以显示锁屏控制界面,有些手机不行)。请问大佬们,你们是怎么做的。

2026-01-24 20:47 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

锁屏控制(通知栏媒体控制、锁屏界面上一曲/下一曲/暂停按钮)在 uni-app 里必须依赖原生能力,uni-app 官方只提供了 JS 层的 uni.getBackgroundAudioManager(),真正的锁屏 UI 与事件分发仍需要原生插件补足。
目前社区里兼容性做得最好、且持续维护的有两条路线,您可以优先尝试:

  1. 插件市场现成的「通用型」插件
    搜索关键字:锁屏控制通知栏音乐media-style-notification
    推荐插件:

    • [DCloud 官方推荐] 原生通知栏音乐控制器(Android)
      https://ext.dcloud.net.cn/plugin?id=1820
    • 锁屏控制 & 蓝牙媒体键(Android + iOS)
      https://ext.dcloud.net.cn/plugin?id=6714
      这两个插件都提供了 uts 源码,支持 uni-app 4.x,Android 端用 MediaStyle Notification + MediaSessionCompat,iOS 端用 MPNowPlayingInfoCenter + MPRemoteCommandCenter,基本能覆盖 95% 机型。接入时只要在 manifest.json → app-plus → distribute → ios 里加 "UIBackgroundModes": ["audio"],Android 端把插件勾上即可。
  2. 自己写 uts 插件(核心思路)
    如果上面插件仍不能满足需求,可以 fork 它们的源码做二次开发。关键代码片段:

    • Android(uts)
      val session = MediaSessionCompat(context, "music")  
      session.setCallback(object : MediaSessionCompat.Callback() {  
      override fun onPlay() { emit("play") }  
      override fun onPause() { emit("pause") }  
      override fun onSkipToNext() { emit("next") }  
      override fun onSkipToPrevious() { emit("prev") }  
      })  
      val style = androidx.media.app.NotificationCompat.MediaStyle()  
      .setMediaSession(session.sessionToken)  
      val notification = NotificationCompat.Builder(context, "music")  
      .setStyle(style)  
      .setSmallIcon(R.drawable.ic_music)  
      .build()  
      NotificationManagerCompat.from(context).notify(1, notification)  
    • iOS(uts)
      let center = MPRemoteCommandCenter.shared()  
      center.playCommand.addTarget { _ in  
      UniApp.emit("play"); return .success  
      }  
      center.pauseCommand.addTarget { _ in  
      UniApp.emit("pause"); return .success  
      }  
      center.nextTrackCommand.addTarget { _ in  
      UniApp.emit("next"); return .success  
      }  
      center.previousTrackCommand.addTarget { _ in  
      UniApp.emit("prev"); return .success  
      }  

      然后在 uni-app 里监听这些事件即可。

  3. 常见坑 & 规避方案

    • Android 8.0+ 必须带 NotificationChannel,否则通知不显示。
    • iOS 16+ 需要在 Info.plist 里声明 NSAppleMusicUsageDescription
    • 部分国产 ROM(小米/华为)需要在设置里手动打开「锁屏显示」权限,可在插件里引导用户跳转。
    • 如果长音频出现 buffered 不再增长导致播放中断,参考官方 issue 的临时方案:在 onTimeUpdate 里判断剩余缓冲 < 10 秒时手动 pause()play() 触发二次缓冲。

总结:先用插件市场已有的成熟插件,能省 90% 工作量;确实需要定制,再基于 uts 插件自己扩展。

内容为 AI 生成,仅供参考

要回复问题请先登录注册