#java #awt #screenshot #macos-big-sur #awtrobot
Вопрос:
Я создаю простую тестовую программу для создания скриншотов всего экрана, после некоторых исследований я создал следующий код:
public class PrintScreenCatcher {
public String capture(){
try {
Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
Robot robot = new Robot();
BufferedImage screenShot = robot.createScreenCapture(rectangle);
File file=createTempFilePath();
ImageIO.write(screenShot, "jpg", file);
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private File createTempFilePath() throws IOException {
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyyMMddHHmmssS");
return File.createTempFile("screen-" LocalDateTime.now().format(formatter),".jpg");
}
}
После запуска этой программы я ожидал увидеть изображение на весь экран (меню macOS, Intellij и т. Д.):
Вместо этого я получил изображение, содержащее только фон моего рабочего стола:
Я думаю, что робот пытается сделать снимок экрана только моей программы. Что мне нужно сделать, чтобы сделать снимок экрана с открытыми экранами?
Комментарии:
1. Как вы выполняете свой код? Где основной метод?
2. @GilbertLeBlanc Я запускаю его в июне
Ответ №1:
Проблема заключалась в разрешении macOS. В соответствии с этим ответом программе требуется разрешение на запись экрана. Я просто добавил доступ к IntelliJ в Системные настройки -> Безопасность и конфиденциальность ->> Конфиденциальность ->>> Запись экрана>>> и это сработало.
Ответ №2:
Я добавил основной метод и сделал следующее изображение в Windows 10 с использованием Java 14.0.2 с кодом, скомпилированным в соответствии со стандартом Java 8.
Вот код, с которым я работал. Если вы все еще получаете пустой экран на Mac, что ж, я не могу вам помочь.
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javax.imageio.ImageIO;
public class PrintScreenCatcher {
public static void main(String[] args) {
System.out.println(new PrintScreenCatcher().capture());
}
public String capture() {
try {
Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
Robot robot = new Robot();
BufferedImage screenShot = robot.createScreenCapture(rectangle);
File file = createTempFilePath();
ImageIO.write(screenShot, "jpg", file);
return file.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private File createTempFilePath() throws IOException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssS");
return File.createTempFile("screen-" LocalDateTime.now().format(formatter), ".jpg");
}
}