Android9-W517-使用NotificationListenerService监听通知

目录

一、前言

二、前提

三、方案

方案一

方案二

方案三

方案四

方案五

方案六

方案七

关于NotificationListenerService类头注释

四、结论


  

一、前言

        NotificationListenerService可以让应用监听所有通知,但是无法获得监听通知的权限,如下六种方案暂时均未实现,已提交case请芯片厂商紫光展锐去解决,正在验证方案七。

二、前提

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

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

  3. 该应用没有设置SystemUID。

三、方案

方案一

        通过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 = cn
                intent.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.packageManager
        pm.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.simpleName

    override fun onBind(intent: Intent?): IBinder? {
        return super.onBind(intent)
    }

}

方案七

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

@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类头注释

       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 设备上,通知侦听器无法获取通知访问权限或被系统绑定。

四、结论

        目前还未解决此问题,大概率与芯片厂商在这块有改动相关,有进一步进展再更新此文章!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb JSP

JSP(Java Server Page)是J2EE的功能模块,是Java服务器页面,由Web服务器执行,作用就是降低动态网页开发难度,将Java代码与HTML分离,降低开发难度,本质就是Servlet。 Servlet的缺点&a…

元素水平垂直居中的方法有哪些?

文章目录 css 实现垂直水平居中实现方式利用定位margin:auto利用定位margin:负值利用定位transformtable布局flex布局grid网格布局小结有需要的请私信博主,还请麻烦给个关注,博主不定期更新组件封装和文章编写,或许能够…

ffmpeg使用vaapi解码后的视频如何基于x11或EGL实现0-copy渲染?

技术背景 对于ffmpeg硬解码后渲染常见的做法是解码后通过av_hwframe_transfer_data方法将数据从GPU拷贝到CPU,然后做一些转换处理用opengl渲染,必然涉及到譬如类似glTexImage2D的函数将数据上传到GPU。而这样2次copy就会导致CPU的使用率变高&#xff0c…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:外描边设置)

设置组件外描边样式。 说明: 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 outline outline(value: OutlineOptions) 统一外描边样式设置接口。 卡片能力: 从API version 11开始,该…

【题解】—— LeetCode一周小结9

【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结8 26.二叉搜索树的范围和 题目链接:938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1: 输…

Stable Diffusion——Animate Diff一键AI图像转视频

前言 AnimateDiff 是一个实用框架,可以对文本生成图像模型进行动画处理,无需进行特定模型调整,即可为大多数现有的个性化文本转图像模型提供动画化能力。而Animatediff 已更新至 2.0 版本和3.0两个版本,相较于 1.0 版本&#xff…

MySQL 多表查询 连接查询 自连接

介绍 自连接查询,可以是内连接查询,也可以是外连接查询,一句话自己连接自己,一个表当作两个表进行连接。 语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件两个表A说明是同一张表,但是别名不同 案例…

【ue5】滑铲系统蓝图笔记

大致逻辑如下: 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色,便于区分。 二、调整动画 1.启动根运动 启动根运动后,人物才可以位移,不然只能在原地。 打开动画序列,勾选启用根运动Enabled…

好书推荐丨细说PyTorch深度学习:理论、算法、模型与编程实现

文章目录 写在前面深度学习推荐图书内容简介作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本深度学习的全新正版书籍,感兴趣的小伙伴快来看看吧~ 深度学习 深度学习是机器学习的一个分支,它模仿人脑神经网络的工作原理进行复杂的…

网络协议栈--应用层--HTTPS协议

目录 一、HTTPS协议原理1.1 HTTPS协议是什么?1.2 概念准备1.2.1 什么是“加密”?1.2.2 为什么要加密?1.2.3 常见的加密方式1.2.3.1 对称加密1.2.3.2 非对称加密 1.2.4 数据摘要&&数据指纹1.2.5 数字签名1.2.6 理解链-承上启下 1.3 HT…

掘根宝典之C语言字符串输入函数(gets(),fgets(),get_s())

字符串输入前的注意事项 如果想把一个字符串读入程序,首先必须预留该字符串的空间,然后用输入函数获取该字符串 这意味着必须要为字符串分配足够的空间。 不要指望计算机在读取字符串时顺便计算它的长度,然后再分配空间(计算机不会这样做&a…

软件实例,佳易王账单账本记账汇总统计管理系统软件教程

软件实例,佳易王账单账本记账汇总统计管理系统软件教程 一、前言 以下软件程序教程 以 佳易王账单记账汇总统计管理系统软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 账单可以记录 1、收入明细 2、支出明细 3、客户…

信息安全是什么

信息安全,也称为信息安全或数据安全,是防止未经授权的访问、更改、中断和破坏信息。 信息安全本身包括的范围很大,大到国家军事政治等机密安全,小范围的当然还包括如防范商业企业机密泄露,防范青少年对不良信息的浏览…

Excel中筛选合并单元格后,只显示第一行怎么办?

Excel中筛选合并单元格后,只显示第一行怎么办? 参考链接:https://baijiahao.baidu.com/s?id=1736773058549439034&wfr=spider&for=pc 我们日常的Excel数据在展示的时候为了数据的清晰和美观往往部分相同的单元格进行合并,但是合并之后在筛选时会发现结果会显示异…

Vanna-ai -基于RAG的TextToSql实现方案

官方连接:Vanna.AI - Personalized AI SQL Agent 1.背景 基于大模型的TextToSql的关键为给大模型提供正确有效的数据库信息及问题,以提升大模型生成sql的正确率。database_info question形成prompt,但是实际中通常会遇到一个问题&#xff…

【前端】Vite打包页面简单部署到GitHub上

创建仓库---->上传代码---->设置 注意点已经打上箭头,代码我传到的是test分支 vite打包的配置如图,base是仓库名称,docs是build后生成的打包目录。 上传到GitHub就自动部署了 访问就是第一张图里的一串地址,这种方式比较方便吧

Claude 3 模型列表

claude-3-opus-20240229 这个模型就好

Midjourney入门:AI绘画真的能替代人类的丹青妙笔吗?

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍1、Midjourney2、使用方法 二、绘画1、动物类2、风景类3、动漫类4、艺…

CNAN知识图谱辅助推荐系统

CNAN知识图谱辅助推荐系统 文章介绍了一个基于KG的推荐系统模型,代码也已开源,可以看出主要follow了KGNN-LS 。算法流程大致如下: 1. 算法介绍 算法除去attention机制外,主要的思想在于:user由交互过的item来表示、i…