Android 屏蔽锁屏界面上的通知显示

news2024/11/16 5:41:20

一. 前言

        [定制需求描述]:在插入SD后,  锁屏状态下, 去掉提示“SD卡可用于传输照片和媒体文件”

需求拆解:  要求正常显示在SystemUI下拉状态栏,  只需要屏蔽在锁屏状态下的通知.

二. 发送通知

首先来找找这个字符串"可用于传输照片和媒体文件"

是在/frameworks/base/core/res/res/values-zh-rCN.xml 中

在源码中搜索引用该字符串的文件为:StorageNotification.java     路径为:

 frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java

当插入SD后的逻辑代码为:

 private void onVolumeStateChangedInternal(VolumeInfo vol) {
        switch (vol.getType()) {
            case VolumeInfo.TYPE_PRIVATE:
                onPrivateVolumeStateChangedInternal(vol);
                break;
                //SD卡
            case VolumeInfo.TYPE_PUBLIC:
                onPublicVolumeStateChangedInternal(vol);
                break;
        }
    }

接下来, 待SD卡挂载成功后,就会走 onVolumeMounted(vol)方法

private Notification onVolumeMounted(VolumeInfo vol) {
....
Notification.Builder builder = buildNotificationBuilder(vol, title, text)
....
}

方法中,会创建通知builder对象

private Notification.Builder buildNotificationBuilder(VolumeInfo vol, CharSequence title,
            CharSequence text) {
        Notification.Builder builder =
                new Notification.Builder(mContext, NotificationChannels.STORAGE)
                        .setSmallIcon(getSmallIcon(vol.getDisk(), vol.getState()))
                        .setColor(mContext.getColor(R.color.system_notification_accent_color))
                        .setContentTitle(title)
                        .setContentText(text)
                        .setStyle(new Notification.BigTextStyle().bigText(text))
                        .setVisibility(Notification.VISIBILITY_PUBLIC)
                        .setLocalOnly(true)
                        .extend(new Notification.TvExtender());
        overrideNotificationAppName(mContext, builder, false);
        return builder;
    }

接下来回到 onPublicVolumeStateChangedInternal中, 当builder创建成功后,接下来就是发送通知

 private void onPublicVolumeStateChangedInternal(VolumeInfo vol) {
....
mNotificationManager.notifyAsUser(vol.getId(), SystemMessage.NOTE_STORAGE_PUBLIC,
                    notif, UserHandle.of(vol.getMountUserId()));
....
}

三. 显示通知

熟悉SystemUI模块的开发人员, 可以直接看管理锁屏状态下通知显示的文件:

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java  它是一个接口文件, 里面有这两个方法:

一个是通过userId 来过滤,  一个是字符串String key 来过滤隐藏通信

    boolean shouldHideNotifications(int userId);
    boolean shouldHideNotifications(String key);

具体的实现文件为NotificationLockscreenUserManagerImpl.java文件

我是通过用key这个方法来过滤的

public boolean shouldHideNotifications(String key) {
        if (getEntryManager() == null) {
            Log.wtf(TAG, "mEntryManager was null!", new Throwable());
            return true;
        }
        return isLockscreenPublicMode(mCurrentUserId)
                && getEntryManager().getNotificationData().getVisibilityOverride(key) ==
                        Notification.VISIBILITY_SECRET;
    }

通过全局搜索这个方法被调用的地方

 

 在NotificationFilter.java文件中的shouldFilterOut 方法中

  /**
     * @return true if the provided notification should NOT be shown right now.
     */
    public boolean shouldFilterOut(NotificationEntry entry) {
        final StatusBarNotification sbn = entry.notification;
        if (!(getEnvironment().isDeviceProvisioned()
                || showNotificationEvenIfUnprovisioned(sbn))) {
            return true;
        }

        if (!getEnvironment().isNotificationForCurrentProfiles(sbn)) {
            return true;
        }

        if (getUserManager().isLockscreenPublicMode(sbn.getUserId())
                && (sbn.getNotification().visibility == Notification.VISIBILITY_SECRET
                        || getUserManager().shouldHideNotifications(sbn.getUserId())
                        || getUserManager().shouldHideNotifications(sbn.getKey()))) {
            return true;
        }
....

}

这个方法表达的意思就是 在特定条件下过滤掉通知, 所以这样子就有解决方法了, 我们在这个方法中根据特定的判断条件,返回true,表示需要在锁屏界面上过滤掉这个通知显示.

四. 解决方案

既然是通过key作为判断条件, 在发送通知的地方加上一个key相关的方法

 private Notification.Builder buildNotificationBuilder(VolumeInfo vol, CharSequence title,
            CharSequence text) {
        Notification.Builder builder =
                new Notification.Builder(mContext, NotificationChannels.STORAGE)
                        .setSmallIcon(getSmallIcon(vol.getDisk(), vol.getState()))
                        .setColor(mContext.getColor(R.color.system_notification_accent_color))
                        .setContentTitle(title)
                        .setContentText(text)
                        .setStyle(new Notification.BigTextStyle().bigText(text))
                        .setVisibility(Notification.VISIBILITY_PUBLIC)
                        .setLocalOnly(true)
                        //加上这个自定义的key  不需要显示在锁屏界面
                        .setGroup("not_show_on_lockscreen")
                        .extend(new Notification.TvExtender());
        overrideNotificationAppName(mContext, builder, false);
        return builder;
    }

然后在显示通知的过滤方法中,加入判断条件并返回true

    public boolean shouldFilterOut(NotificationEntry entry) {
        final StatusBarNotification sbn = entry.notification;
        if (!(getEnvironment().isDeviceProvisioned()
                || showNotificationEvenIfUnprovisioned(sbn))) {
            return true;
        }
        //在锁屏界面不显示SD卡的通知
        if ("not_show_on_lockscreen".equals(sbn.getGroupKey())) {
            return true;
        }
        //
   ....

   }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buuctf_随便注

根据题目猜测这是一道SQL注入的题目输入一个单引号触发报错,根据报错信息得知闭合条件就是一对单引号继续构造表达式,得出一共包含两个回显位构造表达式求出当前数据库的名称,但是根据回显数据和实践来看,此题是对select进行了过滤…

【软件设计师12】数据流图DFD

数据流图DFD 必考下午第一道大题!!! 基本概念、数据字典、数据平衡原则 1. 基本概念 顶层图是系统,再看中间跟外部数据的交换流不变,内部细化,最底层图进一步细化 数据存储在题干描述时,要么…

一文弄清-BP的过拟合与validationCheck

本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com BP神经网络的训练经常会遇到过拟合的情况,导致模型在训练效果上很好但预测效果差 正因如此,matlab工具箱引入validationCheck来防止BP神经网络走向过拟合 本文介绍过拟合是…

SOTIF 预期功能安全ISO21448介绍、功能安全标准ISO26262 与若干安全标准的适用范围和开发流程映射

SOTIF 预期功能安全ISO21448介绍、功能安全标准ISO26262 与若干安全标准的适用范围和开发流程映射 ISO 21448 中规定了预期功能安全的设计开发流程图, 如下图所示。首先从 第 5 条出发, 进行规范和设计。该部分是将进行整车级、 系统级、 组件级等功能规…

快速了解Depop注册新方法,轻松一分钟入驻

东哥我是在几个月前第一次认识depop这个平台,原因是当时主要是让手底下的员工去操作,团队毕竟涉及到的平台都比较多,我就没那么多精力放在depop上,但却意外发现这个平台给我们带来很不错的业绩!所以东哥今天打算给大家…

阿里p8大牛三年整理出全网最全的5万字的《Java核心知识手册》

利用空余时间整理了一份《Java核心知识手册》,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。 前段时间,朋友圈分享了这份这份面试手册的初稿,在几位同学的提议下,对手册进…

线程夯死的排查及解决

最近做的业务一直是和第三方交互的业务,为了加快速度,基本上都是采用多线程,然而时不时总是发生一些推送任务莫名的卡死,知道前几天的一次发现,让我开始了线程的排查之路,希望对大家的有一定的启发和借鉴一…

使用Mybatis-plus在xml文件中实现自己定义的sql逻辑

1、创建数据库表(前提安装配置好Mysql,并且会使用) DROP TABLE IF EXISTS USER; CREATE TABLE USER (id BIGINT(20) NOT NULL COMMENT 主键ID,NAME VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NUL…

【C51单片机】8-温湿度监测显示系统(LCD1602、温湿度传感器、IIC、OLED)

1.LCD1602概述 LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 1602 即 32 字符(16列两行) //硬件接线 //电源 VSS -- GND VDD -- 5V //对比度 VO -- GND //控制线 RS -- P1.0 RW -- P1.1 E -- P1.4 //背光灯 A -- 5…

华为VRRP配置

拓扑图 PC1电脑配置 指定ip192.168.10.1 网关192.18.10.254 LSW1交换机配置 ge0/0/1 access &#xff0c;vlan10 ge0/0/2 trunk ge0/0/3 trunk <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Informa…

基础练习 闰年判断

def is_leap_year(year):if year % 4 0 and year % 100 ! 0 or year % 400 0:print("yes")else:print("no")if __name__ __main__:is_leap_year(int(input()))

题解,git的使用,MySQL与JDBC的使用(上)

题解 引入&#xff1a;tarjan算法&#xff0c;强连通分量&#xff0c;割点&#xff0c;割边&#xff0c;点双联通分量&#xff0c;边双联通分量 P4961 小埋与扫雷 思路&#xff1a;分别求出数字和空格相加即可 #include<iostream> using namespace std; const int X[8]…

图片与视频相关冷知识

目录 色彩的相关概念 色深 色相与饱和度 色调 冷色调与暖色调 色温 白平衡 白平衡偏移 色阶 色阶中的直方图 对比亮度 视频相关概念 像素数 分辨率 逐行扫描与隔行扫描 对比度 高对比度与低对比度 清晰度&#xff08;也称锐度&#xff09; 锐化 锐化与锐度…

果推断16--市场营销中资源分配问题的直接异质因果学习

题目&#xff1a;市场营销中资源分配问题的直接异质因果学习 Direct Heterogeneous Causal Learning for Resource Allocation Problems in Marketing 论文链接&#xff1a;https://export.arxiv.org/pdf/2211.15728v2.pdf 摘要&#xff1a;资源分配是市场营销中一类重要的决…

定点除法运算

目录 一、原码除法运算 1.原码比较法和恢复余数法 ⑴比较法 ⑵恢复余数法 2.原码不恢复余数法&#xff08;原码加减交替法&#xff09; 二、补码除法运算 1、够减的判断 2、上商规则 3、商符的确定 4、求新部分余数 5、末位恒置1 乘法的…

nssctf web入门(4)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 [ZJCTF 2019]NiZhuanSiWei [ZJCTF 2019]NiZhuanSiWei…

本周大新闻|微软IVAS 1.2预计24年交付;华为发布AR-HUD方案

本周XR大新闻&#xff0c;AR方面&#xff0c;IVAS 1.2版预计24年交付&#xff1b;苹果AR眼镜预计26年采用超透镜方案&#xff1b;苹果首款XR头显由和硕转立讯代工&#xff1b;一加展示新款AR眼镜原型&#xff1b;镭昱点亮单片全彩Micro-LED&#xff1b;苹果智能指环专利公布。 …

windows10 java 创建合约

a. 安装Nodejs 主要是方便使用npm 命令 并配置环境变量 b.使用 npm 可以便捷地安装Solidity编译器solcjs npm install -g solc c.找个目录 创建一个solidity文件 如 // SPDX-License-Identifier: GPL-3.0pragma solidity >0.8.2 <0.9.0;/*** title Storage* dev Store…

ChatGPT引爆AI热潮,未来有哪些核心落地场景与投资机遇?

自ChatGPT面世以来&#xff0c;AI行业再度被引爆&#xff0c;AI大模型作为新一代颠覆性技术同时掀起了一波又一波热潮&#xff0c;头部厂商与创业者纷纷涌入&#xff0c;备受业界瞩目与市场追捧。 在这汹涌的狂欢背后&#xff0c;实则代表着AI发展的阶跃&#xff0c;即AI直接创…

和ChatGPT关于Swing music的一场对话(上篇)

什么是 Swing Music &#xff1f; Swing Music 是一款漂亮的自托管音乐播放器&#xff0c;适用于您的本地音频文件。就像一个更酷的 Spotify …但带上你自己的音乐。 第一次在 reddit 上看到 Swing Music&#xff0c;就被其 UI 吸引了 但源码站点的releases 中只有 windows 和 …