我正在编写一个需要截取用户屏幕截图的应用程序。 我正在使用 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/