Android9-W517-使用NotificationListenerService监听通知

目录

一、前言

二、前提

三、方案

方案一

方案二

方案三

方案四

方案五

方案六

方案七

四、关于NotificationListenerService类头注释

五、结论


一、前言

        NotificationListenerService可以让应用监听所有通知,但是无法获得监听通知的权限,如下六种方案暂时均未实现,最终验证方案七+方案二可行

二、前提

  1. 应用:客制化桌面(com.**.launcher);

  2. 应用内置在 /system/priv-app/ 下;

  3. 应用没有设置:android:sharedUserId="android.uid.system"。

三、方案

方案一

        通过Action跳转《系统设置》应用,手动打开通知监听权限:android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS——结果如图:显示在此设备上不能获得此特性——暂不可行;

    if (!AppUtils.isNotificationListenersEnabled(context, context.packageName)) {AppUtils.gotoNotificationAccessSetting(context)}fun isNotificationListenersEnabled(context: Context, packageName: String): Boolean =NotificationManagerCompat.getEnabledListenerPackages(context).contains(packageName)fun gotoNotificationAccessSetting(context: Context): Boolean {return try {val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)context.startActivity(intent)true} catch (e: ActivityNotFoundException) {// 普通情况下找不到的时候需要再特殊处理找一次try {val intent = Intent()intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)val cn = ComponentName("com.android.settings","com.android.settings.Settings\$NotificationAccessSettingsActivity")intent.component = cnintent.putExtra(":settings:show_fragment", "NotificationAccessSettings")context.startActivity(intent)return true} catch (e1: java.lang.Exception) {e1.printStackTrace()}//            Toast.makeText(this, "对不起,您的手机暂不支持", Toast.LENGTH_SHORT).show()e.printStackTrace()false}}

方案二

        在源码frameworks/base/core/res/res/values/config.xml路径下,修改config_defaultListenerAccessPackages属性的值为应用包名com.***.launcher——在之前的Android11、Android12上此种方案可行,但在W517的Android9上暂不可行;    

  

方案三

        接着方案一,把设置应用的低内存检查去掉,但在通知访问权限弹窗中,点击Allow后系统同样不生效,甚至申请通知访问权限的应用【Launcher2D】会被杀死后重启——暂不可行;

方案四

        在系统初次初始化时就将通知权限加入secure 数据库中,但是依旧未生效——暂不可行;

  

方案五

        在应用启动时,去重新关闭打开一次监听服务,但是它依旧未正常工作——暂不可行;

    private fun toggleNotificationListenerService() {Log.e("TAG", "toggleNotificationListenerService: ")val pm: PackageManager = context.packageManagerpm.setComponentEnabledSetting(ComponentName(context, MNotificationListenerService::class.java), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)pm.setComponentEnabledSetting(ComponentName(context, MNotificationListenerService::class.java), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)}

方案六

        如果是某些厂商没有采用google那一套通知逻辑,修改了系统源码,比如:Binder接口被修改,在通知的时候如果采用google那一套,则极有获取不到通知,但即使无论怎么改,调用修改后源码那一套super(arg0)总是没错的;可以试着在NotificationTask类中onBind方法中返回return super.onBind(arg0)——暂不可行

class MNotificationListenerService : NotificationListenerService() {private val TAG = MNotificationListenerService::class.java.simpleNameoverride fun onBind(intent: Intent?): IBinder? {return super.onBind(intent)}}

方案七

        接着方案一,修改设备为非低内存设备,即将ActivityManager的isLowRamDeviceStatic方法直接返回false,如下,编译系统后验证OK...【开心】

@SystemService(Context.ACTIVITY_SERVICE)
public class ActivityManager { public static boolean isLowRamDeviceStatic() {
//        return RoSystemProperties.CONFIG_LOW_RAM ||
//                (Build.IS_DEBUGGABLE && DEVELOPMENT_FORCE_LOW_RAM);return false;}}

        原因如下: 参考第四节NotificationListenerService类头注释Android10及更低版本的低RAM设备上,NotificationListenerService是无法获取通知访问权限的。

        解决方案:关掉低内存设备的判断逻辑,直接返回false。

四、关于NotificationListenerService类头注释

       

1、 Android 11/12的NotificationListenerService类头注释中有如下内容:

        Notification listeners cannot get notification access or be bound by the system on low-RAM devices running Android Q (and below).

        翻译过来就是说:在运行 Android Q(及更低版本)的低 RAM 设备上,通知侦听器无法获取通知访问权限或被系统绑定。

       

2、 Android 9的NotificationListenerService类头注释中有如下内容:

        Notification listeners cannot get notification access or be bound by the system on low-RAM devices.

        翻译过来就是说:在低 RAM 设备上,通知侦听器无法获取通知访问权限或被系统绑定。

五、结论

        使用方案七+方案二即可。


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

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

相关文章

HTML标签语义化,前端开发学习计划

正文 HTML中的标签从闭合的角度可以分为闭合标签和空标签。而HTML中大部分标签都是闭合标签&#xff0c;其他少数为空标签&#xff1b; 常见的空标签&#xff1a; <input />、 <img />、 <area />、 <base />、 <link />等 HTML中对标签另一种…

QT国际化,将所有中文用tr函数包裹

cmake: # #设置qm文件输出位置 set_source_files_properties(adSoft_ch.ts adSoft_en.ts PROPERTIES OUTPUT_LOCATION "${CMAKE_SOURCE_DIR}/l2_viewer/dist/translations") #生成翻译文件 qt_add_lupdate(${PROJECT_NAME} TS_FILES adSoft_ch.ts adSoft_en.ts) # 生…

修改一个教材上的网站源码使它能在www服务器子目录上正常运行

修改一个教材上的网站源码&#xff0c;使它能在www服务器子目录上正常运行。 该网站源码是教材《PHPMySQL网站开发项目式教程》上带的网站源码。该源码是用 php html 写的。该源码包含对mysql数据库进行操作的php代码。以前该网站源码只能在www服务器的根目录上正常运行&…

uniapp 小程序AP配网

一、TCPSocket.js 封装TCP协议 class socket {constructor() {this.connection {};}// 创建一个TCP实例establish(monitor) {this.connection wx.createTCPSocket();this.connection.connect({ address: "192.168.1.1", port: 9100 });}// 发送消息connect(messag…

人工智能AI网站推荐

排名部分先后: arXiv: https://arxiv.org/ - arXiv 是一个由康奈尔大学维护的预印本(Preprint)服务器,研究人员可以在这里分享其最新的科学研究成果,包括人工智能领域的论文。 IEEE Xplore: IEEE Xplore - IEEE Xplore 是IEEE(电气和电子工程师协会)提供的数据库,收录了…

C语言数据结构与算法——深度、广度优先搜索(DFS、BFS)

目录 一、深度优先搜索&#xff08;Depth-First-Search 简称&#xff1a;DFS&#xff09; 无向图的深度优先搜索 有向图的深度优先搜索 二、广度优先搜索&#xff08;Breadth-First-Search 简称&#xff1a;BFS&#xff09; 无向图的广度优先搜索 有向图的广度优先搜索 深…

【工具】PIL图片颜色处理

使用前置函数&#xff0c;用于图片效果显示 from PIL import Image, ImageOps, ImageEnhance import matplotlib.pyplot as pltclass SHOW:def __init__(self):self.idx 0# 创建宽10英寸、高90英寸self.fig plt.figure(figsize(10,90))def add(self, img, title):self.idx …

【JavaEE】_Spring MVC项目之使用对象传参

目录 1. 使用对象传参 2. 后端参数重命名问题 2.1 关于RequestPara注解 本专栏关于Spring MVC项目的单个及多个参数传参一文中&#xff0c;已经介绍过了对于不同个数的参数传参问题&#xff0c;原文链接如下&#xff1a; 【JavaEE】_Spring MVC 项目单个及多个参数传参-CSD…

HTML笔记1

1&#xff0c;标签的写法 <strong>加粗内容</strong> <hr> 2&#xff0c;快速生成骨架 !加[Tab] <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content&…

2024高频前端面试题 Vue2 和 Vue3 篇

* Vue2 和 Vue3的区别&#xff1a; 1&#xff09;双向数据绑定原理的区别 2&#xff09;根节点的不同 Vue2只能一个根节点 Vue3在组件中可以放置多个根节点 3&#xff09;Vue3中采用composition API vue2:采用的选项型API(opsition API) vue3:采用的组合型API(composition A…

分类算法入门:以鸢尾花数据集为例

近两年人工智能技术蓬勃发展&#xff0c;OpenAI连续放出ChatGPT、Sora等“王炸”产品&#xff0c;大模型、AIGC等技术带来了革命性的提升&#xff0c;很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局&#xff0c;从个人角度来说要尽快跟上时代的潮…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

echarts柱状图可鼠标左击出现自定义弹框,右击隐藏弹框并阻止默认右击事件

每项x轴数据对应有两条柱图和一条阴影效果是学习其它博客得到的效果&#xff0c;这个是学习的原文链接&#xff1a;echarts两个合并柱体&#xff08;普通柱状图象形柱图&#xff09;共享一个柱体阴影 因为这次情况比较特殊&#xff0c;不仅需要自定义弹框内容&#xff0c;而且…

JAVA中YML:几个用法

项目有一些配置文件&#xff0c;ini、prop类型的配置文件都考虑过后&#xff0c;还是选择yml文件&#xff0c;如上图&#xff1a;xxconfig.yml。 要求&#xff1a; 1、允许实施人员手动配置 2、配置文件要能轻便的转化为一个JAVA对象 3、程序启动后&#xff0c;打印这些配置项&…

DQL语言学习(2024/3/5)one

1.基础查询&#xff1a; select 查询列表 from 表名&#xff1b; 查询列表可以是&#xff1a;①表中的字段、②常量值、③表达式、④函数 ①查询表中的单个字段&#xff0c;多个字段&#xff0c;所有字段 select *from 表名&#xff1b; ③查询表达式: select 100*98; ④…

在ubuntu16上用dkpg安装vscode 出现错误

Could not parse file "/usr/share/applications/Qt5.12.9.desktop": Key file contains line ktop Entry] which is not a key-value pair, group, or comment dpkg: 依赖关系问题使得 code 的配置工作不能继续&#xff1a;code 依赖于 libc6 (> 2.28)&#xff1…

图论相关内容

建图 邻接矩阵 void tu1() {cin >> n >> m;for (int i 1; i < m; i) {int u, v;cin >> u >> v;//int w;cin>>w;--->边权mp[u][v] 1;//w//mp[v][u] 1;//w --->无向图} } 邻接表 void tu2() {vector<vector<int>>adj(…

【QT】QMainWindow介绍

QMainWindow Label&#xff1a;可以放静态/动态图片/链接 菜单栏工具栏浮动窗口和核心部件状态栏 Qdialog 模拟对话框非模拟对话框标准对话框和文件对话框 在创建文件时&#xff0c;路径一定不能有中文&#xff0c;否则会报错 双击下面的 Line Edit&#xff1a;只能显示一…

C语言怎样提⾼循环语句的效率?

一、问题 在C语⾔程序中&#xff0c;常常使⽤循环结构来解决特定的问题。那么在设计程序时&#xff0c;怎样才能提⾼循环语句的效率呢&#xff1f; 二、解答 C循环语句中&#xff0c;for 语句使⽤频率最⾼&#xff0c;while 语句其次&#xff0c;do 语句很少⽤。提⾼循环体效率…

公告显示一次之后不在显示用js和jq不喜勿喷

// 使用if判断页面中的本地存储是否有值 若有则为true 不显示if (sessionStorage.getItem("name1") true) {$("#hint").hide();// 若没有 则显示内容} else {$("#hint").show();} // 公告确定让其隐藏事件 function enter() { $("#hint…