Delphi 监听安卓(Android)手机通知栏信息

因为一些业务需要,我们有时候需要知道手机通知栏显示的信息,然后根据这些信息去处理一些相应的业务逻辑。如:自动监听收到的短信验证码,提取后自动填写到我们APP的验证码输入项中,减少使用者查看短信再记忆、再输入验证的过程,提升用户使用体验。除了短信,其他通知栏显示的信息我们可能也会有着其他较为实用的需要。

在使用这项功能前,我们需要了解一些基本知识。

安全问题

因为监听通知栏信息涉及到较为隐私的信息,出于安全考虑,Android并没有提供自动权限设置的功能,也就是只能通过机主以手工去确认是否允许该APP监听通知栏信息。通常多数手机也不能通过“设置”或其他菜单连接的方式找到并打开,他需要在APP中以代码方式打开并设置。

通常设置类似上图,手机不同会有细微差别。

主要开发过程

本文简单记录开发过程。
首先需要实现并注册NotificationListenerService服务。用于监听通知栏信息,其次需要实现对权限的判断与管理,最后是完成服务监听到信息的处理。

NotificationListenerService服务

我在实现过程中尝试过使用delphi来处理,目前暂时没有成功,只好使用JAVA完成服务功能的部分代码,然后通过服务将监听到的数据发送给delphi程序做后续处理。
需要用JAVA实现onNotificationPosted及onNotificationRemoved方法。并通过工具生成JNI单元文件,以便在delphi中可以使用。主要包括:

  [JavaSignature('com/tanqin/nlsapp/NLService')]JNLService = interface(JNotificationListenerService)//or JObject // SuperSignature: android/service/notification/NotificationListenerService['{F7F3FEFD-FA30-4A7A-97D5-70643997C7F3}']procedure onNotificationPosted(sbn: JStatusBarNotification); cdecl;//(Landroid/service/notification/StatusBarNotification;)Vprocedure onNotificationRemoved(sbn: JStatusBarNotification); cdecl;//(Landroid/service/notification/StatusBarNotification;)Vend;TJNLService = class(TJavaGenericImport<JNLServiceClass,JNLService>)end;JLocalBroadcastManagerClass = interface(JObjectClass)['{3013CC6D-4E7D-44D9-9F61-E849944E1091}']{class} function getInstance(P1: JContext): JLocalBroadcastManager; cdecl;//(Landroid/content/Context;)Landroid/support/v4/content/LocalBroadcastManager;end;

服务注册

需要在“AndroidManifest.template.xml”文件中增加如下定义,其中android:name=”com.tanqin.nlsapp.NLService”行,指定了监听服务类名称,label用于显示监听服务名字,以便于识别。

        <service android:name="com.tanqin.nlsapp.NLService" android:label="通知监听"android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"><intent-filter><action android:name="android.service.notification.NotificationListenerService" /></intent-filter></service>   

初始化服务主要代码

  //初始化服务Fser := TJNLService.JavaClass.init;FNLS := TJIntent.JavaClass.init(SharedActivityContext,Fser.getClass);FNLS.setAction(StringToJString('android.service.notification.NotificationListenerService'));

判断监听是否授权

只有被授权的APP才能监听通知栏信息。

  //判断通知监听是否被受权//通知的监听必须有特定的受权,没有这个受权,不能接收通知//该受权还必须是人工点击确认,这点非常重要CheckBox1.IsChecked := AnsiContainsText(JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivityContext.getContentResolver,StringToJString('enabled_notification_listeners'))),'com.tanqin.nlsapp');

调用通知监听授权

以下代码及过调用通知监听授权功能,显示内容如上面第一张截图。

varji: JIntent;
begin//打开授权管理//通知的监听必须有特定的授权没有这个授权,不能接收通知//该授权还必须是人工点击确认,这点非常重要//这里是启动手动受权确认功能ji := TJIntent.JavaClass.init(StringToJString('android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS'));SharedActivityContext.startActivity(ji);
end;

启动监听服务

启动监听服务前,先判断是否授权,如果没有授权则调用授权功能。

varvENL: Boolean;
begin//开户服务前判断通知监听是否被受权vENL := AnsiContainsText(JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivityContext.getContentResolver,StringToJString('enabled_notification_listeners'))),'com.tanqin.nlsapp');CheckBox1.IsChecked := vENL;if vENL thenbegin//打开通知监听服务SharedActivityContext.startService(FNLS);CheckBox2.IsChecked := True;endelsebegin//转受权处理   {无受权,不能使用}end;end;

APP完成后的演示

该APP演示了通过监听获取通知栏通知信息的程序包名(用于识别通知发送者)、通知标题、通知内容、通知时间、提交或清除事件。

下图是已经连续运行四天的监听截图。

后续

该APP通过调整,可指定监听某些特定通知内容。

欢迎大家光临本人小店 :https://shop63778938.taobao.com/

Delphi 监听安卓(Android)手机通知栏信息相关推荐

  1. 微信小程序区分ios安卓Android手机设备信息

    初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 官方文档:https://developers.weixi ...

  2. 如何无缝监听安卓手机通知栏推送信息以及拒接来电

    作者:咕咚移动技术团队-乔瑟琳 一.监听安卓手机通知栏推送信息 最近在需求中需要实现监听安卓手机通知栏信息的功能,比如实时获取qq.微信.短信消息.一开始评估是件挺简单的事儿,实现 Notificat ...

  3. 移动端监听安卓手机返回键

    [场景] 相信大家用安卓手机使用APP的过程中,会遇到这样的一个场景:按下手机的返回键时,会弹出一个询问框:"是否退出该页面/APP?",然后点击了确认键才真正退出APP.PC端目 ...

  4. 移动端监听安卓手机返回键 1

    [场景] 相信大家用安卓手机使用APP的过程中,会遇到这样的一个场景:按下手机的返回键时,会弹出一个询问框:"是否退出该页面/APP?",然后点击了确认键才真正退出APP.PC端目 ...

  5. 混合开发监听安卓手机物理返回键

    混合开发监听安卓手机物理返回键 在用h5做混合开发过程中由于有个考试考试页面,中途不能退出,退出要添加确认操作,所以需要监听手机的返回操作,不让用户直接通过返回键返回 目前了解到混合开发中有两种方式监 ...

  6. android 通知 广告,解决三星/小米等Android手机通知栏推送广告的问题

    三星和小米都是使用安卓系统的手机,有时候突然在手机通知栏弹出很多的广告,而且广告是不定时的弹出,你把消息清理掉之后,过段时间还是会弹出广告. 而且下载的都是一些乱七八糟的东西,对手机没有什么用处,想完 ...

  7. dcloud 5+ 监听安卓前后台切换状态 并后台运行程序

    dcloud 5+ 监听安卓前后台切换状态 并后台运行程序 监听安卓前后台切换状态 function monitorRunStatus() {// 部分型号监听"应用从前台切换到后台&quo ...

  8. Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记

    Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记 中间遇到各种问题导致最终没法看到抓包信息,一个坑一个坑的埋,终于成功抓包小程序. 梳理了下可以尽量减少栽坑的安装过程,如 ...

  9. android studio 课程表,基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)...

    基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)(毕业论文12000字,程序代码) 摘 要 随着IT技术的发展,以前老套的课程表内容查询管理方式已 ...

最新文章

  1. github下载速度慢解决方法
  2. jQuery Easing 动画效果扩展--使用Easing插件,让你的动画更具美感。
  3. 编码互换变量c语言,【剑仙教程】TC。字符 和字符编码 互换。
  4. Spring Boot启动过程源码分析--转
  5. mysql的binary、char、varchar区别
  6. Zigbee 电动智能窗帘系统 解决方案
  7. Python可变传参: *args和**kwargs
  8. pascal voc2012分割标签处理
  9. 终结符与非终结符详述
  10. 算法笔记 : 透视变换(透射变换)
  11. .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突
  12. android 的悬浮窗口,Android 之 悬浮窗口
  13. ROS机器人程序设计(原书第2版).
  14. centos查看内存插槽及已插内存分布及大小命令
  15. VirtualBox虚拟机怎么复制文件到物理机(主机)
  16. meso-四(4-N,N,N-三甲基氨基苯基)卟啉(TTMAPP);[5,15-二乙炔基-10,20-二(3,4,5-三(十六烷氧基)苯基)卟啉]锌(DBTCPP-Zn);锌卟啉(TPP-Zn)科研级
  17. c语言中 在对全部数组元素赋初值时,在对数组全部元素赋初值时,不可以省略行数,但能省略列数...
  18. 活动回顾 谷露招聘沙龙VOL.6 解锁校招人才获取新玩法
  19. 【JS逆向】知乎请求头 _x-zes-96 webpack还原
  20. [5GC] [图解5GC信令流程] PDU会话建立

热门文章

  1. win10蓝屏的处理思路
  2. “六合上甲”一体化数据开发平台获“2022 DAMA中国数据治理优秀产品”大奖
  3. apdl与传统计算机语言,ANSYS经典APDL语言详解及ANSYS二次开发
  4. 埃拉托色尼筛选法------筛选质数
  5. 【数学】-1的根号二次方等于多少?
  6. 17_1.Excel股票分析工具-开盘前涨停数据
  7. 【观察】星环科技重构数据云平台,持续释放数据红利和价值
  8. 前端css解决z-index 上层元素遮挡下层元素的方法
  9. Access-VBA
  10. 第一章图像处理基础概念(人眼和光)