我正在编写一个需要截取用户屏幕截图的应用程序。 我正在使用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
方法是否应该抛出异常,因为未授予权限?
答案 0 :(得分:1)
您正在创建一些新的SecurityManager
而不是与现有的SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new AWTPermission("readDisplayPixels"));
}
交谈,所以试试这个:
SecurityManager
也就是说,如果VM的实例为try-catch
,您可以与它通信以检查限制,如果没有这样的实例 - 只需执行您想要执行的任何操作。祝你好运!
P.S。除非它们带有一些有用的信息,否则不应该使用自己的消息来影响堆栈跟踪。在你的情况下,你只是隐藏了一些有利于无意义消息的重要信息。不要那样做。
以防万一我没说清楚 - 第二个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);
}
}
的实际代码:
{{1}}
答案 1 :(得分:0)
您需要重新构建代码,只需一点点:)。你很亲密。
try {
new SecurityManager().checkPermission(new AWTPermission("readDisplayPixels"));
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
System.out.println("Screenshot taken!");
} catch (SecurityException e) {
System.out.println("Permission not granted!");
} catch (Exception e) {
System.out.println("Taking screenshot failed.");
}
当抛出第一个安全异常时,它们永远不会进入屏幕捕获语句。
希望有所帮助:)