Android开发之获取通知栏的内容
如下图:
这个需求是别人外包项目给我提出的一个需求。
1.拿到通知栏的内容
2.将通知栏内容写入本地
3.显示通知内容到屏幕上
这demo目前就这三个小模块
这是获取的微信消息的内容
我们来看下源码:
MyNotifiService.java
package com.qfy.getnotifiservice;import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.widget.Toast;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;@SuppressLint("OverrideAbstract")
public class MyNotifiService extends NotificationListenerService {private BufferedWriter bw;private SimpleDateFormat sdf;private MyHandler handler = new MyHandler();private String nMessage;private String data;Handler mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {String msgString = (String) msg.obj;Toast.makeText(getApplicationContext(), msgString, Toast.LENGTH_LONG).show();}};@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("KEVIN", "Service is started" + "-----");data = intent.getStringExtra("data");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onNotificationPosted(StatusBarNotification sbn) {// super.onNotificationPosted(sbn);try {//有些通知不能解析出TEXT内容,这里做个信息能判断if (sbn.getNotification().tickerText != null) {SharedPreferences sp = getSharedPreferences("msg", MODE_PRIVATE);nMessage = sbn.getNotification().tickerText.toString();Log.e("KEVIN", "Get Message" + "-----" + nMessage);sp.edit().putString("getMsg", nMessage).apply();Message obtain = Message.obtain();obtain.obj = nMessage;mHandler.sendMessage(obtain);init();if (nMessage.contains(data)) {Message message = handler.obtainMessage();message.what = 1;handler.sendMessage(message);writeData(sdf.format(new Date(System.currentTimeMillis())) + ":" + nMessage);}}} catch (Exception e) {Toast.makeText(MyNotifiService.this, "不可解析的通知", Toast.LENGTH_SHORT).show();}}private void writeData(String str) {try {
// bw.newLine();
// bw.write("NOTE");bw.newLine();bw.write(str);bw.newLine();
// bw.newLine();bw.close();} catch (IOException e) {e.printStackTrace();}}private void init() {sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {FileOutputStream fos = new FileOutputStream(newFile(), true);OutputStreamWriter osw = new OutputStreamWriter(fos);bw = new BufferedWriter(osw);} catch (IOException e) {Log.d("KEVIN", "BufferedWriter Initialization error");}Log.d("KEVIN", "Initialization Successful");}private File newFile() {File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + File.separator + "ANotification");fileDir.mkdir();String basePath = Environment.getExternalStorageDirectory() + File.separator + "ANotification" + File.separator + "record.txt";return new File(basePath);}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:
// Toast.makeText(MyService.this,"Bingo",Toast.LENGTH_SHORT).show();}}}
}
再看下mainactivity.java
package com.qfy.getnotifiservice;import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;import com.gionee.notificationmonitor.R;public class MainActivity extends AppCompatActivity {private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.button);Button button2 = findViewById(R.id.button2);Button button3 = findViewById(R.id.button3);editText = findViewById(R.id.editText);Intent intent = new Intent(MainActivity.this, MyNotifiService.class);//启动服务startService(intent);//启动服务final SharedPreferences sp = getSharedPreferences("msg", MODE_PRIVATE);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String getMsg = sp.getString("getMsg", "");if (!TextUtils.isEmpty(getMsg)){editText.setText(getMsg);}}});button2.setOnClickListener(new View.OnClickListener() {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)@Overridepublic void onClick(View v) {//打开监听引用消息Notification accessIntent intent_s = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);startActivity(intent_s);}});button3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent_p = new Intent(Settings.ACTION_APPLICATION_SETTINGS);startActivity(intent_p);}});}
}
再看下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取收到的内容" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开启通知监听服务" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开启数据读写权限" /></LinearLayout>
记得服务要在xml里面注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.gionee.notificationmonitor"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name="com.qfy.getnotifiservice.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name="com.qfy.getnotifiservice.MyNotifiService"android:priority="1000"android:label="通知监控"android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"><intent-filter><action android:name="android.service.notification.NotificationListenerService" /></intent-filter></service></application></manifest>
如果是新手看不懂,可以下载我源码查看:
源码下载
感谢博主:https://www.cnblogs.com/gaigaige/p/7999337.html
Android开发之获取通知栏的内容相关推荐
- android获取版本号报错,Android开发:获取安卓App版本号的方法步骤
在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版本号就是必须要有的功能.Android的App版本号相关内容比iOS的App版本号内容要多,而 ...
- android获取安卓版本,Android开发:获取安卓App版本号的方法步骤
今天国庆节,在这举国欢庆的日子里,发一篇博文留念一下这个特殊的日子,国庆依然奋战在工作一线. 在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版 ...
- Android开发环境——模拟器AVD相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关内 ...
- Android开发之获取通话记录
上一篇讲的是Android开发之获取手机通讯录,这一篇博客也将针对手机联系人这一块进行开发.下面是获取手机通话记录的详细步骤: 1. 首先,我们需要新建一个类CallLogInfo,用于通话记录的数据 ...
- Android开发之获取相册照片和获取拍照照片
在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...
- android开发:获取键盘的高度(实测真实有效)
android开发:获取键盘的高度(实测真实有效) 由于最近在做即时通讯,做类似于微信的点击键盘消失,弹出表情页面(表情页面的高度和键盘的高度一致),于是在网上看了好多android测键盘高度的代码, ...
- Android开发——后台获取用户点击位置坐标(可获取用户支付宝密码)
1. getevent命令 我们首先是根据adb shell getevent命令获取到被点击位置的信息. 这里要说明的是,不同的手机手机获得的点击输出是不一样的.以我的真机为例,输出如下 本文原创, ...
- Android开发之获取当前展示的activity的包名,类名
在进行Android开发学习过程中,有时候我们想实现这种功能: 从自己写的小应用里启动其它APP. 这听起来似乎很简单,使用intent的隐式启动就可以了. Intent intent = new I ...
- Android开发环境——Eclipse ADT相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...
最新文章
- Caliburn.Micro 资源随时添加
- 抓取一个连续的网页_搞懂各大搜索引擎蜘蛛的抓取规则,快速获得排名!
- window.location获取url各项参数详解
- ubuntu-桌面版-常用设置
- bzoj4427【Nwerc2015】Cleaning Pipes清理管道
- OpenCASCADE绘制测试线束:拓扑命令之历史命令
- html触发js参数怎么用,js 绑定带参数的事件以及手动触发事件
- 【TensorFlow-windows】MobileNet理论概览与实现
- MySQL总结(二)——入门
- Linux 之 shell 比较运算符
- PHP - Redis实现入队出队
- SSM小项目(会议管理系统)二整合mybatis(图解超详细)
- 人脸识别(Face Recognition)简要综述
- linux查看jdk版本_linux环境查看jdk版本
- ECharts数据可视化饼状图(环形图-进度半圆形)
- pdf文件怎么编辑,如何修改pdf文字
- html阅读封面代码,HTML5/SVG 书本封面设计
- 关于最新版mumu模拟器(2.2.16)安装xposed框架
- linux删除文件夹或者文件
- 人工智能是怎样辅助安全自动化、分析处理和响应的?
热门文章
- 过程计算机控制综合课程设计,自动化10本 12升《计算机控制综合课程设计》任务书...
- tensorflow环境下的识别食物_在TensorFlow+Keras环境下使用RoI池化一步步实现注意力机制...
- 西门子上升沿指令_西门子SCL编程实例——霓虹灯顺序控制(DECO指令)
- Rplidar学习(五)—— rplidar使用cartographer_ros进行地图云生成
- mysql-ubuntu卸载安装mysql
- Angular16 Angular整合zTree、异步加载节点数据
- vue源码学习--vue源码学习入门
- [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】
- 使用完成端口监控文件目录的例子
- asp.net 导出Excel 设置格式