java - 截图,但未授予权限?

时间:2014-02-22 13:09:07

标签: 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方法是否应该抛出异常,因为未授予权限?

2 个答案:

答案 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.");
 }

当抛出第一个安全异常时,它们永远不会进入屏幕捕获语句。

希望有所帮助:)