android 广播监听截屏,Android 应用监听截屏操作
最近要求做一个app内监听截屏,然后调用自己的分享功能。
结合我的业务实际,以下是完整代码。
0.局部变量
private String data;//截图图片路径
private Handler mUiHandler;
private MediaContentObserver mInternalObserver;
private MediaContentObserver mExternalObserver;
private static final String[] MEDIA_PROJECTIONS = {
// MediaStore.Images.ImageColumns.WIDTH,
// MediaStore.Images.ImageColumns.HEIGHT,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.DATE_TAKEN
};
private static final String[] KEYWORDS = {
"screenshot", "screen_shot", "screen-shot", "screen shot", "截屏",
"screencapture", "screen_capture", "screen-capture", "screen capture",
"screencap", "screen_cap", "screen-cap", "screen cap"
};//国内机器截图路径有中文,有可能还得做国际化适配
自定义媒体内容观察者内部类(观察媒体数据库的改变)
private class MediaContentObserver extends ContentObserver {
private Uri mediaContentUri; // 需要观察的Uri
public MediaContentObserver(Uri contentUri, Handler handler) {
super(handler);
mediaContentUri = contentUri;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 处理媒体数据库反馈的数据变化
handleMediaContentChange(mediaContentUri);
}
}
2.注册监听
private void initMediaContentObserver() {
// 运行在 UI 线程的 Handler, 用于运行监听器回调
mUiHandler = new Handler(Looper.getMainLooper());
// 创建内容观察者,包括内部存储和外部存储
mInternalObserver = new MediaContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, mUiHandler);
mExternalObserver = new MediaContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mUiHandler);
// 注册内容观察者
getContentResolver().registerContentObserver(
MediaStore.Images.Media.INTERNAL_CONTENT_URI, false, mInternalObserver);
getContentResolver().registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, mExternalObserver);
}
3.处理数据
private void handleMediaContentChange(Uri contentUri) {
Cursor cursor = null;
try {
// 数据改变时查询数据库中最后加入的一条数据
cursor = getContentResolver().query(contentUri,
MEDIA_PROJECTIONS,
null, null, MediaStore.Images.ImageColumns.DATE_ADDED + " desc limit 1");
if (cursor == null) return;
if (!cursor.moveToFirst()) return;
// cursor.getColumnIndex获取数据库列索引
int dateTakenIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATE_TAKEN);
long dateTaken = cursor.getLong(dateTakenIndex); // 图片生成时间
//因为该监听也会监听到删除截图的操作,所以判断最后一张图的时间和现在时间,如果相差8s内,则认为是刚截图
//国内部分机器刚截的图并不是马上就写进去,而是放在内存了,8s是一个经验值
if (System.currentTimeMillis() - dateTaken > 8000) return;
int dataIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
data = cursor.getString(dataIndex); // 图片存储地址
// int width = 0;
// int height = 0;
// int widthIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.WIDTH);
// int heightIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.HEIGHT);
// width = cursor.getInt(widthIndex); // 获取图片高度
// height = cursor.getInt(heightIndex); // 获取图片宽度
// 处理获取到的第一行数据
handleMediaRowData(data);
} catch (AndroidRuntimeException e) {
//1.Android7.0以下机器要求用FLAG_ACTIVITY_NEW_TASK启动
//2.部分机器写入截图实在是太慢,给个800ms延迟
mUiHandler.postDelayed(() ->
startActivity(ShareCapturePicActivity.newIntent(this, data,
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)), 800);
e.printStackTrace();
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
}
//处理监听到的资源
private void handleMediaRowData(String data) {
if (checkScreenShot(data)) {
startActivity(ShareCapturePicActivity.newIntent(this, data, Intent.FLAG_ACTIVITY_SINGLE_TOP));
}
}
//判断是否是截屏
private boolean checkScreenShot(String data) {
data = data.toLowerCase();
// 判断图片路径是否含有指定的关键字之一, 如果有, 则认为当前截屏了
for (String keyWork : KEYWORDS) {
if (data.contains(keyWork)) {
return true;
}
}
return false;
}
顺带提一下
onNewIntent的周期
第一次singleTop启动,正常onCreate--start--resume
后续就是 onNewIntent---start--resume
android 广播监听截屏,Android 应用监听截屏操作相关推荐
- Android 广播实现原理解析
Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...
- Android广播接实现电话的监听(电话的状态,拦截)
Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...
- android 8.1 截屏,Android8.1 MTK平台 截屏功能分析
前言 涉及到的源码有 frameworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java vendormediate ...
- Android软键盘弹出和收起的监听
Android软键盘弹出和收起的监听 1.直接调用 SoftKeyboardHelper softKeyboardHelper = softKeyboardHelper = new SoftKeybo ...
- 【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.建VideoView播放容器(即XML) 二.使用步骤 1.访问布局中的字段 2.实现视频播放 3.实现视频播放状 ...
- android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...
下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...
- android获取状态栏截屏按钮状态,关于代码截屏带状态栏的问题
昨天产品经理告诉我,希望能实现仿网易严选那样,可以捕捉到用户的截屏操作,然后进行截屏分享的小功能. 在实现的过程中遇到的最大问题就是截屏为什么没有状态栏???然后各种查找,资料聊聊无几,只有大神Ope ...
- android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...
[实例简介] android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android N ...
- Android监听作用,Android开发之CheckBox的简单使用与监听功能示例
本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...
- android datepicker 监听,Android编程之DatePicker和TimePicke简单时间监听用法分析
本文实例讲述了Android编程之DatePicker和TimePicke简单时间监听用法.分享给大家供大家参考,具体如下: DatePicker和TimePicker都是从FrameLayout派生 ...
最新文章
- TinyMind人工智能社区5月热门技术文章排行榜TOP15
- sdn和nfv的区别—Vecloud微云
- 【MM模块】Cycle Counting 周期盘点
- 编写业务层和持久层事务控制代码并配置spring的ioc
- 检测和语义分割_分割和对象检测-第5部分
- 如何正确使用工业级交换机?
- Spring Data Redis实战之提供RedisTemplate
- Hdu-6243 2017CCPC-Final A.Dogs and Cages 数学
- vmware嵌套虚拟化对服务器的影响,VMware 虚拟机嵌套部署 KVM 虚拟机小结
- 大厂不一定要进,算法必须要学!精选算法文章89篇
- 股票分析软件编程开发日记与总结,自动交易软件开发
- 网络七层协议的通俗理解
- 车牌识别SDK原理分析
- A。资源库和运行时表结构(5)---JBPM4.4数据库表解释
- 阿里云服务器购买教程(新手指南)
- 如何查询电脑系统和服务器地址,如何查询电脑系统和服务器地址
- 程序员常用的工具网站
- 解决excel数据透析表计算类型没有非重复计数选项
- 编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个 Employee对象的生日,则将该雇员的工资增加100元。
- 答 ricky52529 关于EF线程、事件、编译器、IDE……