Delphi 监听安卓(Android)手机通知栏信息
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)手机通知栏信息相关推荐
- 微信小程序区分ios安卓Android手机设备信息
初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 官方文档:https://developers.weixi ...
- 如何无缝监听安卓手机通知栏推送信息以及拒接来电
作者:咕咚移动技术团队-乔瑟琳 一.监听安卓手机通知栏推送信息 最近在需求中需要实现监听安卓手机通知栏信息的功能,比如实时获取qq.微信.短信消息.一开始评估是件挺简单的事儿,实现 Notificat ...
- 移动端监听安卓手机返回键
[场景] 相信大家用安卓手机使用APP的过程中,会遇到这样的一个场景:按下手机的返回键时,会弹出一个询问框:"是否退出该页面/APP?",然后点击了确认键才真正退出APP.PC端目 ...
- 移动端监听安卓手机返回键 1
[场景] 相信大家用安卓手机使用APP的过程中,会遇到这样的一个场景:按下手机的返回键时,会弹出一个询问框:"是否退出该页面/APP?",然后点击了确认键才真正退出APP.PC端目 ...
- 混合开发监听安卓手机物理返回键
混合开发监听安卓手机物理返回键 在用h5做混合开发过程中由于有个考试考试页面,中途不能退出,退出要添加确认操作,所以需要监听手机的返回操作,不让用户直接通过返回键返回 目前了解到混合开发中有两种方式监 ...
- android 通知 广告,解决三星/小米等Android手机通知栏推送广告的问题
三星和小米都是使用安卓系统的手机,有时候突然在手机通知栏弹出很多的广告,而且广告是不定时的弹出,你把消息清理掉之后,过段时间还是会弹出广告. 而且下载的都是一些乱七八糟的东西,对手机没有什么用处,想完 ...
- dcloud 5+ 监听安卓前后台切换状态 并后台运行程序
dcloud 5+ 监听安卓前后台切换状态 并后台运行程序 监听安卓前后台切换状态 function monitorRunStatus() {// 部分型号监听"应用从前台切换到后台&quo ...
- Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记
Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记 中间遇到各种问题导致最终没法看到抓包信息,一个坑一个坑的埋,终于成功抓包小程序. 梳理了下可以尽量减少栽坑的安装过程,如 ...
- android studio 课程表,基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)...
基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)(毕业论文12000字,程序代码) 摘 要 随着IT技术的发展,以前老套的课程表内容查询管理方式已 ...
最新文章
- github下载速度慢解决方法
- jQuery Easing 动画效果扩展--使用Easing插件,让你的动画更具美感。
- 编码互换变量c语言,【剑仙教程】TC。字符 和字符编码 互换。
- Spring Boot启动过程源码分析--转
- mysql的binary、char、varchar区别
- Zigbee 电动智能窗帘系统 解决方案
- Python可变传参: *args和**kwargs
- pascal voc2012分割标签处理
- 终结符与非终结符详述
- 算法笔记 : 透视变换(透射变换)
- .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突
- android 的悬浮窗口,Android 之 悬浮窗口
- ROS机器人程序设计(原书第2版).
- centos查看内存插槽及已插内存分布及大小命令
- VirtualBox虚拟机怎么复制文件到物理机(主机)
- meso-四(4-N,N,N-三甲基氨基苯基)卟啉(TTMAPP);[5,15-二乙炔基-10,20-二(3,4,5-三(十六烷氧基)苯基)卟啉]锌(DBTCPP-Zn);锌卟啉(TPP-Zn)科研级
- c语言中 在对全部数组元素赋初值时,在对数组全部元素赋初值时,不可以省略行数,但能省略列数...
- 活动回顾 谷露招聘沙龙VOL.6 解锁校招人才获取新玩法
- 【JS逆向】知乎请求头 _x-zes-96 webpack还原
- [5GC] [图解5GC信令流程] PDU会话建立
热门文章
- win10蓝屏的处理思路
- “六合上甲”一体化数据开发平台获“2022 DAMA中国数据治理优秀产品”大奖
- apdl与传统计算机语言,ANSYS经典APDL语言详解及ANSYS二次开发
- 埃拉托色尼筛选法------筛选质数
- 【数学】-1的根号二次方等于多少?
- 17_1.Excel股票分析工具-开盘前涨停数据
- 【观察】星环科技重构数据云平台,持续释放数据红利和价值
- 前端css解决z-index 上层元素遮挡下层元素的方法
- Access-VBA
- 第一章图像处理基础概念(人眼和光)