You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为安卓音乐可视化应用实现Always On Display功能?

音乐可视化应用实现Always On Display(AOD)的最优方案

核心方案:用Android WindowManager 创建锁屏上层视图

这是贴合AOD场景的标准实现方式,比全屏意图更适配需求——全屏意图会强制解锁或唤起全屏,而AOD只需要在锁屏/息屏状态下显示轻量可视化内容。

关键实现步骤

  • 声明必要权限:在AndroidManifest.xml中添加权限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISPLAY_OVER_OTHER_APPS" />
    

    注意:Android 10及以上版本,需要引导用户手动开启「显示在其他应用上层」权限。

  • 配置窗口参数:设置WindowManager.LayoutParams,让视图能显示在锁屏之上:

    val params = WindowManager.LayoutParams().apply {
        type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
        }
        flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        width = WindowManager.LayoutParams.MATCH_PARENT
        height = WindowManager.LayoutParams.MATCH_PARENT
        format = PixelFormat.TRANSLUCENT
        gravity = Gravity.CENTER
    }
    
  • 添加可视化视图:自定义View或SurfaceView实现音乐渲染,通过WindowManager挂载到窗口:

    val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
    val visualizerView = MusicVisualizerView(this) // 自定义的可视化视图类
    windowManager.addView(visualizerView, params)
    
  • 监听屏幕状态:通过BroadcastReceiver监听屏幕熄灭/点亮广播,控制AOD视图的显示与隐藏:

    class ScreenStateReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (intent?.action) {
                Intent.ACTION_SCREEN_OFF -> showAODView()
                Intent.ACTION_SCREEN_ON -> hideAODView()
            }
        }
    }
    

优化细节

  • 降低功耗:屏幕熄灭时限制可视化帧率(15-30fps即可),使用PARTIAL_WAKE_LOCK仅保持CPU运行,避免不必要的资源消耗。
  • 适配系统版本:Android 12+对AOD有严格规范,需避免过亮内容;可配合系统原生AOD框架调整视图样式,但窗口方式的灵活性更高。
  • 权限异常处理:若用户关闭「显示在其他应用上层」权限,需立即隐藏视图并提示用户重新开启。

为什么不推荐Full Screen Intent?

Full Screen Intent的设计目标是处理紧急场景(如来电、闹钟),会强制唤起全屏界面并解锁锁屏,完全违背AOD「息屏/锁屏下轻量显示」的需求,会严重打断用户的锁屏状态,体验极差。

内容的提问来源于stack exchange,提问作者skinnyhrit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:07:15