Android 通知栏,锁屏播放音乐,类似音乐播放器

article/2025/7/2 8:47:17

项目中需要用到播放音频的功能,想做一个类似酷狗、酷我这样的音频播放功能,在通知栏和锁屏时都可以操控音乐,开发中发现oppo reno手机在锁屏时不显示通知栏,研究了整整一天终于解决,特作记录,给遇到同样问题的童鞋做个参考。

整体功能实现思路如下:

1.播放音乐时启动前台服务,在服务中创建播放器和通知并且创建广播,音频的播控通过广播来操控,实现跨模块;

2.在切换音频源、播放、暂停的时候通过重新创建通知来实现通知的界面更新;

3.在关闭音频功能时关掉通知,释放播放器。

 

细节,以下只做简单说明,具体实现方式请百度,本文只是为了解决锁屏不显示通知的问题,已测试正常使用的机型有华为、荣耀、oppo:

1.通知的自定义view为remoteView;

2.通知创建时需要判断8.0渠道配置:

    private fun createChannel(context: Context, channel_id: String, channel_name: CharSequence, description: String) {//8.0以上版本通知适配if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val notificationChannel = NotificationChannel(channel_id, channel_name, NotificationManager.IMPORTANCE_HIGH)notificationChannel.setSound(null, null)notificationChannel.enableLights(false) //通知灯notificationChannel.lightColor = Color.RED // 通知灯颜色notificationChannel.setShowBadge(false) //角标notificationChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC // 所有情况下显示,包括锁屏notificationChannel.description = descriptionval notificationManager = context.getSystemService(NotificationManager::class.java)notificationManager.createNotificationChannel(notificationChannel)}}/*** 返回一个前台通知** @param channel_id  通知渠道id,注意8.0创建通知的时候渠道id与此要匹配* @param remoteViews 自定义通知view* @return*/fun createForeNotification(context: Context, channel_id: String, channel_name: CharSequence, description: String, remoteViews: RemoteViews): Notification {CreateChannel(context, channel_id, channel_name, description)val builder = NotificationCompat.Builder(context, channel_id).setSmallIcon(R.mipmap.ic_launcher) //最顶部的小图标.setContent(remoteViews).setAutoCancel(true) // 允许自动清除.setPriority(NotificationCompat.PRIORITY_MAX).setSound(Uri.EMPTY) //声音.setDefaults(NotificationCompat.DEFAULT_ALL) //统一消除声音和震动.setVisibility(Notification.VISIBILITY_PUBLIC) // 所有情况下显示,包括锁屏return builder.build()}

3.对通知设置点击事件,切换、暂停、播放的原理一样,如果别的模块需要调用播控的话直接发送广播即可:

        // 暂停val pauseIntent = Intent(AudioBroadCastReceiver.PAUSE)val pausePendingIntent = PendingIntent.getBroadcast(this, 0, pauseIntent, 0)notifyLayout.setOnClickPendingIntent(R.id.iv_music_pause, pausePendingIntent)// 播放val playIntent = Intent(AudioBroadCastReceiver.PLAY)val playPendingIntent = PendingIntent.getBroadcast(this, 0, playIntent, 0)notifyLayout.setOnClickPendingIntent(R.id.iv_music_play, playPendingIntent)
object AudioBroadCastReceiver : BroadcastReceiver() {private val TAG = javaClass.simpleNameconst val PLAY_PRE = "com.audio.PLAY_PRE"const val PLAY_NEXT = "com.audio.PLAY_NEXT"const val PLAY = "com.audio..PLAY"const val PAUSE = "com.audio.PAUSE"// 停止播放器、关闭通知、关闭服务、关掉播放界面const val CLOSE = "com.audio.CLOSE"var receiveListener: ((Context, Intent?) -> Unit)? = nulloverride fun onReceive(context: Context, intent: Intent?) {Logger.d(TAG, "onReceive: ${intent?.action}")val audioPlayerHelper = App.get().audioPlayerHelperintent?.let {when (it.action) {PLAY_PRE -> {Logger.d(TAG, "onReceive: 上一节")audioPlayerHelper.playPre()}PLAY_NEXT -> {Logger.d(TAG, "onReceive: 下一节")audioPlayerHelper.playNext()}PLAY -> {Logger.d(TAG, "onReceive: 播放")audioPlayerHelper.play()}PAUSE -> {Logger.d(TAG, "onReceive: 暂停")audioPlayerHelper.pause()}CLOSE -> {Logger.d(TAG, "onReceive: 停止")audioPlayerHelper.stop()}else -> {}}receiveListener?.invoke(context,intent)}}}

4.服务中启动通知:

  startForeground(AudioNotifyHelper.NOTIFY_ID, notification)

5.监听锁屏,我遇到的问题就是在oppo手机上锁屏不显示通知,其实解决办法就是监听锁屏,在锁屏后再次发送一次通知即可:

public class HomeWatcherReceiver extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();private static final String SYSTEM_DIALOG_REASON_KEY = "reason";private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";private PhysicalKeyListener listener;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Logger.i(TAG, "onReceive: action: " + action);if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {// android.intent.action.CLOSE_SYSTEM_DIALOGSString reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);Logger.i(TAG, "reason: " + reason);if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {// 短按Home键Logger.i(TAG, "homekey");if(listener != null){listener.onHome();}} else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {// 长按Home键 或者 activity切换键Logger.i(TAG, "long press home key or activity switch");if(listener != null){listener.onRecentApp();}} else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {// 锁屏Logger.i(TAG, "lock");if(listener != null){listener.onLock();}} else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {// samsung 长按Home键Logger.i(TAG, "assist");if(listener != null){listener.onAssist();}}} else if (Intent.ACTION_SCREEN_ON.equals(action)) { // 开屏Logger.i(TAG, "onReceive: 开屏");if(listener != null){listener.onScreenOn();}} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 锁屏Logger.i(TAG, "onReceive: 锁屏");if(listener != null){listener.onScreenOff();}} else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 解锁Logger.i(TAG, "onReceive: 解锁");if(listener != null){listener.onUserPresent();}}}public void setListener(PhysicalKeyListener listener) {this.listener = listener;}
}

6.在服务中注册锁屏广播监听,监听到锁屏再发一次通知即可。

至此,仿音乐播放器的通知栏和锁屏操控音乐就OK了,如果有特殊机型或者其他情况不管用的,评论区咱们互相讨论、学习。

共勉!

效果如下:

 


http://chatgpt.dhexx.cn/article/w2WPoZpR.shtml

相关文章

Android自定义锁屏实现----仿正点闹钟滑屏解锁

本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 前几周看了下解锁的框架,基本上算是弄了个脸熟。看着别人花哨的解锁界面,心里也很痒痒的。于是,画了一天时间, 捣鼓出了这个成果----仿正点闹钟解…

易安卓打开Android系统中的解锁方式选择页面(锁屏方式选择)

感谢名单 感谢fylfyl2写的https://blog.csdn.net/fyilun/article/details/21257595 E4A打开锁屏方式页面 Intent intent new Intent(); ComponentName cm new ComponentName("com.android.settings","com.android.settings.ChooseLockGeneric"); inte…

Android锁屏的解锁(九个点),使用画的方式

一、效果展示: 这篇博客有解释大概的步骤: https://blog.csdn.net/weixin_44614751/article/details/103101199 二、代码部分: MainActivity.java中的代码: package com.example.drawunlock1;import androidx.appcompat.app.AppCompatActivity;import android.content.re…

让电脑不被锁屏的方法,亲测有效

通过JS来控制键盘,定时按下SCROLLLOCK键,达到电脑不会被锁屏的效果。 通常公司电脑都会自动锁屏,只是时间有长短。有时候闲着了不用电脑,但是却不想让电脑锁屏。那么可以用js代码来控制键盘的按键循环按下实现不锁屏的效果&#x…

android 强制锁屏app,自制力app强制锁屏

自制力app强制锁屏非常适合在学习工作中没有自律性的用户们,当打开app后开启锁屏状态,手机就打不开了,重启也不可能解除锁屏;在此期间,就可以免于手机的打扰,专注学习;感兴趣的小伙伴们快来下载…

android系统密码设置功能,手机锁屏密码怎么设置 三种安卓手机锁屏方式推荐

手机中有很多应用都是与金钱挂钩,特别是微信与支付宝等等既涉及到隐私又与财产关联,这是后手机的安全就尤为重要的,而手机的锁屏密码就是一道最基本的防护措施,那么手机锁屏密码怎么设置?来看看小编推荐的三种安卓手机锁屏方式吧…

Mac锁屏的几种方式

刚换了工作,公司里给配了MacBook,第一次使用,很多常见操作都不知道快捷键,今天来记录下锁屏的几种方式:电脑为MacBook Pro,OS为MacOS Sierra 10.12.3 1. ctrl shift 右上角开关机键 2. option comm…

C语言for循环结构经典练习

文章目录 一、for循环基本知识二、经典例题及解析1.水仙花数2.求规定范围内的完数3.求规定范围内质数4.计算阶乘之和5.计算55555555555555(类型)6.计算112123123412345(类型)7.判断用户输入正整数的位数8.判断某正整数是否为回文数9.九九乘法表10.统计用户输入的字符中&#xf…

Java基础语法——循环结构

每日正能量 趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。 循环结构 【本章内容】1. while循环 2. d…

Python - 循环结构

循环结构 🐍While循环🐍While…else…循环🐍for循环🐍for…else…循环🐍循环体结束语句🐍嵌套循环 本次主要介绍的是程序的循环结构逻辑。 循环就是按照一定的条件重复的去做一件事情,当条件不成…

While循环结构

1.while循环语句 1.1循环概念 循环是程序设计语言中反复执行某些代码的一种计算机处理过程 1.2 while循环的作用 重复执行某些代码 1.3 while循环的基本语法 while 条件: ____反复执行的代码 …… while及while中的代码块就是while循环代码块。看以下示例&#…

三种循环结构

循环结构:循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。下面将对各个循环结…

c语言中循环结构有什么作用,浅谈C语言中循环结构程序设计

高茂婵 吕雪 彭星星 孙新杰 摘要:现在人们对计算机中的算法的要求越来越高,顺序结构已经满足不了人们的需求,我们需要探索更高层次的操作算法。在程序设计中,我们操作的时候经常遇到需要重复执行的情况,而循环结构就恰恰满足了这个要求。在程序设计中,循环结构是算法中必…

Python循环结构

今天我们讲一下python的循环结构,习题比较多,大家多联系,有问题可以给我留言。 目录 一、Python中循环的介绍1、什么是循环?2、循环的作用3、循环的种类 二、while循环基本语法及其应用1、while循环的基本语法2、while循环的执行…

LabVIEW循环结构

LabVIEW可提供For循环和While循环两种循环结构。For循环必须指定循环总次数,达到指定循环次数后程序会自动退出循环;而While循环则不用指定循环次数,只需要指定循环退出条件,如果循环退出条件成立,则退出循环。所以知道…

Python循环结构详解

今天继续给大家介绍Python相关知识,本文主要内容是Python循环结构。 循环是一种编程语言的重要结构,在Python中,存在着两种循环,一种是遍历循环,一种是while循环。 一、遍历循环 所谓遍历循环,即遍历一个…

C语言基础——循环结构

C语言的基本结构之一。在程序中有连续执行的操作可以用循环结构,简化函数,C语言中有三种循环结构,for循环,while循环,do-while循环,其中for循环最常用。 一循环结构概述 1.什么是循环执行 循环执行是循环…

Python中的循环结构

Python中循环的介绍 1、什么是循环 现实生活中,也有很多循环的应用场景: (1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完了 (…

C++循环结构

C循环结构 一、循环结构1、while 循环1.1 语法1.2 练习题1.3 代码找错 2、do-while 循环2.1 语法2.2 练习题 3、for 循环3.1 语法3.2 练习题 4、三种循环执行顺序 二、循环嵌套1.输出正方形2.输出乘法口诀3.输出平行四边形4.输出数字菱形 三、跳转语句1.break语句1.1 在 switch…

MATLAB循环结构

目录 1、for语句 注意事项 (1)for语句针对行向量的每一个元素执行一次循环语句体,循环的次数就是向量中元素的个数,也可以针对任意向量。 (2)可以在for循环语句体中修改循环变量的值,当程序执行流程再次回到循环开始时,就会自…