Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >收听android中的屏幕截图动作

收听android中的屏幕截图动作
EN

Stack Overflow用户
提问于 2015-07-11 10:14:00
回答 1查看 5.7K关注 0票数 11

我是android开发的新手。

我正在制作一个应用程序,当android手机的屏幕截图被拍摄时,它会做出反应。我听说android允许广播接收器可以检测到这种行为,所以我查阅了android文档这里

我认为框架开发人员忘记或没有实现屏幕截图广播代码,因为他们没有在文档中列出此操作。

还有什么别的方法可以让我听截屏吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-08 20:17:02

您可以使用ScreenShot检测ContentObserver捕获的事件。我正在我的一个项目中使用它。

ScreenShotContentObserver.java

代码语言:javascript
运行
AI代码解释
复制
public abstract class ScreenShotContentObserver extends ContentObserver {

    private Context context;
    private boolean isFromEdit = false;
    private String previousPath;

    public ScreenShotContentObserver(Handler handler, Context context) {
        super(handler);
        this.context = context;
    }

    @Override
    public boolean deliverSelfNotifications() {
        return super.deliverSelfNotifications();
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        Cursor cursor = null;
        try {
            cursor = context.getContentResolver().query(uri, new String[]{
                    MediaStore.Images.Media.DISPLAY_NAME,
                    MediaStore.Images.Media.DATA
            }, null, null, null);
            if (cursor != null && cursor.moveToLast()) {
                int displayNameColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME);
                int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
                String fileName = cursor.getString(displayNameColumnIndex);
                String path = cursor.getString(dataColumnIndex);
                if (new File(path).lastModified() >= System.currentTimeMillis() - 10000) {
                    if (isScreenshot(path) && !isFromEdit && !(previousPath != null && previousPath.equals(path))) {
                        onScreenShot(path, fileName);
                    }
                    previousPath = path;
                    isFromEdit = false;
                } else {
                    cursor.close();
                    return;
                }
            }
        } catch (Throwable t) {
            isFromEdit = true;
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        super.onChange(selfChange, uri);
    }

    private boolean isScreenshot(String path) {
        return path != null && path.toLowerCase().contains("screenshot");
    }

    protected abstract void onScreenShot(String path, String fileName);

}

在你的活动中使用这个类:-

代码语言:javascript
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private ScreenShotContentObserver screenShotContentObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HandlerThread handlerThread = new HandlerThread("content_observer");
        handlerThread.start();
        final Handler handler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };

        screenShotContentObserver = new ScreenShotContentObserver(handler, this) {
            @Override
            protected void onScreenShot(String path, String fileName) {
                File file = new File(path); //this is the file of screenshot image
            }
        };

    }

    @Override
    public void onResume() {
        super.onResume();

        getContentResolver().registerContentObserver(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                true,
                screenShotContentObserver
        );
    }

    @Override
    public void onPause() {
        super.onPause();

        try {
            getContentResolver().unregisterContentObserver(screenShotContentObserver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        try {
            getContentResolver().unregisterContentObserver(screenShotContentObserver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

不要忘记在ObserveronPauseonDestroy方法中停止Activity

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31360296

复制
相关文章
XML元素和属性
默认情况下,next()方法不检查是否存在与标记为必需的属性相对应的元素和属性。要使读取器检查此类元素和属性是否存在,请在调用Next()之前将读取器的CheckRequired属性设置为1。出于兼容性原因,此属性的默认值为0。
用户7741497
2022/07/04
1.5K0
XmlSpy / XSD 以及 验证
很早以前看过一句话:“XML就象空气”,在企业应用开发中XML是一个重要的数据交换标准。而XSD则可以用来校验XML的数据格式是否正确。 一个典型的XSD文件如下: 1 <?xml version=
菩提树下的杨过
2018/01/24
1.8K0
XmlSpy / XSD 以及 验证
web-app_2_4.xsd验证web.xml报j2ee_web_services_client_1_1.xsd找不到
web-app_2_4.xsd验证web.xml时报j2ee_web_services_client_1_1.xsd找不到的问题
阿敏总司令
2019/02/28
1.4K0
使用xmllint处理/验证xml
xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令,下面整理一些常用功能
跑马溜溜的球
2020/12/07
1.7K0
使用%XML.TextReader 节点属性
如前所述,类中的%XML.TextReader解析XML文档并创建一个text reader对象,该对象由一组与文档组件相对应的节点组成;节点类型在本章前面的“文档节点”中进行了描述。
用户7741497
2022/07/05
1.1K0
Java使用JAXB对XML设置属性和属性值
复杂点的原因是名称带有冒号,属性也是,没有操作过JAXB是不容易上手,我来记录下实体的代码。
高久峰
2023/10/12
7990
生成XML元素
如果使用RootElement()启动文档的根元素,则负责生成该根元素内的每个元素。有三个选择:
用户7741497
2022/07/04
7510
在未知大小的父元素中设置居中
当提到在web设计中居中元素时。关于被居中的元素和它父元素的信息,你知道的越多就越容易设置。那么假如当你不知道任何信息?居中也是可设置的。
lesM10
2019/08/26
4.5K0
在未知大小的父元素中设置居中
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
创建 XmlParser 解析器 , 传入 Xml 文件对应的 File 对象 ;
韩曙亮
2023/03/30
7.8K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
【XML】快速上手3 XML元素
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
1.1K0
使用XSD编写具有智能提示的XML文件(以SQL-MAP脚本为实例)
    SQL-MAP是PDF.NET(PWMIS数据开发框架)具有特色的开发技术,它可以将SQL语句映射成DAL代码,而且能够做到无需IDAL和DalFactory自动切换数据库到另外一个数据库系统,比如SqlServer切换到Oralcle,有关SQL-MAP的规范请看这里,为什么要使用这种技术,请看“抽象SQL(参数化)查询 ”。     从上面的规范看到,要手写一个SQL-MAP文件还是比较复杂,虽然框架提供了SQL-MAP配置文件管理器,但它主要适用于新手使用,用起来效率不是很高,这个时候就需要有
用户1177503
2018/02/26
1.5K0
XML检查属性
本节讨论可用于获取任何属性的名称、值、命名空间、QName和值命名空间的方法。这些方法分为以下几组:
用户7741497
2022/07/05
5900
【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 设置 xml 标签内容 | 设置 xml 标签属性 )
首先 , 创建 FileWriter 对象 , 之后用于将生成的 xml 数据输出到文件中 ;
韩曙亮
2023/03/30
1.9K0
【Groovy】xml 序列化 ( 使用 MarkupBuilder 生成 xml 数据 | 设置 xml 标签内容 | 设置 xml 标签属性 )
Java xml节点属性的修改[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 Java xml节点属性的修改 修改xml节点的属性,我们先建立一个修改之前的xml文档: <?xml version=”1.0″ encoding=”GB2
全栈程序员站长
2022/09/13
2.1K0
获取元素的样式属性 原
document.getElementById("test").style.color 这种方式获取的只是内联样式,并不能获取内部样式和外部样式,下面为内部样式
tianyawhl
2019/04/04
2.5K0
logback.xml读取spring的属性
因为logback.xml和logback-test.xml会被logback组件直接读取,所以如果要交给spring管理,需要
十毛
2019/08/03
5.9K0
@namespace 属性——XML命名空间
@namespace 是一条 @规则 ,用来规定使用在 CSS 样式表 中的 XML命名空间 。任何 @namespace 规则都必须在所有的 @charset 和 @import 规则之后, 并且在样式表中,位于其他任何 style declarations 之前。
Html5知典
2019/11/26
8310
JavaScript 操作元素属性
1、html的属性和js里面属性写法一样 2、“class” 属性写成 “className” 3、“style” 属性里面的属性,有横杠的改成驼峰式,比如:“font-size”,改成”style.fontSize”
Devops海洋的渔夫
2019/05/31
1.2K0
XML封装与验证消息
Document document = DocumentHelper.createDocument(); document.setXMLEncoding(ChARSET_UTF_8); Element root = document.addElement("message"); Element head = root.addElement("head"); head.addElement("field").addAttribute("name"," ").setText(""); Element bo
用户3003813
2018/09/06
6490
点击加载更多

相似问题

使用XSD验证XML元素属性值

32

通过XSD验证未知XML元素的后代?

17

XML -使用XSD验证属性

17

使用XSD验证XML元素

20

c#在未知嵌套元素上使用XSD验证XML

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档