最近要求做一个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 应用监听截屏操作相关推荐

  1. Android 广播实现原理解析

    Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...

  2. Android广播接实现电话的监听(电话的状态,拦截)

    Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...

  3. android 8.1 截屏,Android8.1 MTK平台 截屏功能分析

    前言 涉及到的源码有 frameworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java vendormediate ...

  4. Android软键盘弹出和收起的监听

    Android软键盘弹出和收起的监听 1.直接调用 SoftKeyboardHelper softKeyboardHelper = softKeyboardHelper = new SoftKeybo ...

  5. 【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.建VideoView播放容器(即XML) 二.使用步骤 1.访问布局中的字段 2.实现视频播放 3.实现视频播放状 ...

  6. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...

    下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...

  7. android获取状态栏截屏按钮状态,关于代码截屏带状态栏的问题

    昨天产品经理告诉我,希望能实现仿网易严选那样,可以捕捉到用户的截屏操作,然后进行截屏分享的小功能. 在实现的过程中遇到的最大问题就是截屏为什么没有状态栏???然后各种查找,资料聊聊无几,只有大神Ope ...

  8. android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...

    [实例简介] android NotificationListenerService 监听通知栏,android NotificationListenerService 监听通知栏 android N ...

  9. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

  10. android datepicker 监听,Android编程之DatePicker和TimePicke简单时间监听用法分析

    本文实例讲述了Android编程之DatePicker和TimePicke简单时间监听用法.分享给大家供大家参考,具体如下: DatePicker和TimePicker都是从FrameLayout派生 ...

最新文章

  1. TinyMind人工智能社区5月热门技术文章排行榜TOP15
  2. sdn和nfv的区别—Vecloud微云
  3. 【MM模块】Cycle Counting 周期盘点
  4. 编写业务层和持久层事务控制代码并配置spring的ioc
  5. 检测和语义分割_分割和对象检测-第5部分
  6. 如何正确使用工业级交换机?
  7. Spring Data Redis实战之提供RedisTemplate
  8. Hdu-6243 2017CCPC-Final A.Dogs and Cages 数学
  9. vmware嵌套虚拟化对服务器的影响,VMware 虚拟机嵌套部署 KVM 虚拟机小结
  10. 大厂不一定要进,算法必须要学!精选算法文章89篇
  11. 股票分析软件编程开发日记与总结,自动交易软件开发
  12. 网络七层协议的通俗理解
  13. 车牌识别SDK原理分析
  14. A。资源库和运行时表结构(5)---JBPM4.4数据库表解释
  15. 阿里云服务器购买教程(新手指南)
  16. 如何查询电脑系统和服务器地址,如何查询电脑系统和服务器地址
  17. 程序员常用的工具网站
  18. 解决excel数据透析表计算类型没有非重复计数选项
  19. 编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个 Employee对象的生日,则将该雇员的工资增加100元。
  20. 答 ricky52529 关于EF线程、事件、编译器、IDE……

热门文章

  1. 统计素数并求和python_C语言实现的统计素数并求和代码分享
  2. 如何使用SQL语句根据经纬度计算距离
  3. 联想数据中心技术总监单奖定:双态IT -数字化转型下的IT建设新思路
  4. vue中播放消息提示音
  5. 单片机C语言程序设计基础知识全解析
  6. 收藏几款好用的网页下载工具(网页下载器)
  7. 【STM32H7的DSP教程】第5章 Matlab简易使用之常用编程语句
  8. 玩通了这4本书,也就掌握了SEO的精髓了
  9. WebService(一):工作原理
  10. 数据分析中会常犯哪些错误,如何解决? 四