java - 已截取屏幕截图,但未授予权限?

标签 java permissions screenshot

我正在编写一个需要截取用户屏幕截图的应用程序。 我正在使用 Robot 类和 createScreenCapture方法来实现这一点。

正如 Javadoc 中所述,需要 readDisplayPixels 权限才能进行屏幕截图。

然后,我在尝试截屏之前尝试检查权限。 我准备了一些代码来展示我做了什么:

import java.awt.AWTPermission;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

public class ScreenshotTest {
    public static void main(String[] args) {
        try {
            new SecurityManager().checkPermission(new AWTPermission("readDisplayPixels"));
        } catch (SecurityException e) {
            System.out.println("Permission not granted!");
        }

        try {
            Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            BufferedImage capture = new Robot().createScreenCapture(screenRect);
            System.out.println("Screenshot taken!");
        } catch (Exception e) {
            System.out.println("Taking screenshot failed.");
        }
    }
}

控制台打印输出是:

Permission not granted!
Screenshot taken!

我现在很困惑,因为我没想到会发生这种事。 createScreenCapture 方法不应该因为未授予权限而抛出异常吗?

最佳答案

您正在创建一些新的 SecurityManager,而不是与(可能)现有的安全管理器对话,因此请尝试以下操作:

SecurityManager sm = System.getSecurityManager();
if (sm != null) {
    sm.checkPermission(new AWTPermission("readDisplayPixels"));
}

也就是说,如果虚拟机有一个 SecurityManager 实例,您可以与其通信以检查限制,如果不存在这样的实例 - 只需执行您想要执行的任何操作。祝你好运!

附注你不应该用你自己的消息来隐藏堆栈跟踪,除非它们携带一些有用的信息。就您而言,您只是隐藏了一些重要的信息,而转而使用无意义的消息。不要这样做。

以防万一我没有说清楚 - 第二个 try-catch block 中的异常不会抛出,因为 Robot 的内部确实与系统的SecurityManager,当您与某个新实例交谈时,该实例没有任何有用的负载。这是来自 Robot.java 的实际代码:

public synchronized BufferedImage createScreenCapture(Rectangle screenRect) {
    checkScreenCaptureAllowed();
    //... proceed
}

private static void checkScreenCaptureAllowed() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkPermission(
            SecurityConstants.AWT.READ_DISPLAY_PIXELS_PERMISSION);
    }
}

关于java - 已截取屏幕截图,但未授予权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21954760/

相关文章:

java - 为什么JVM内存参数一般都是256的倍数?

Linux,如何在禁用执行权限的情况下读取文件

java - Selenium 捕获屏幕截图并保存到 sql

android - 如何使用服务截取我的应用程序的屏幕截图?

ios - 通过键盘应用程序或 iMessage 应用程序截取屏幕截图

java - jdk6和jdk7相同的测试得到不同的结果

java - Kinesis 工作人员错误 : Caught exception when initializing LeaseCoordinator

不带凸起部分的 Java Swing Jbutton 组

java - 在 Linux 上执行 Java 程序时使用 chmod +x 后权限被拒绝

swift - 从 macOS 应用程序调用时使用 "key code"的 applescript 中的错误 1002