이전 포스팅에서 Tesseract로 유저 닉네임중 위첨자를 인식 못하는 것을 확인했다.
따라서 이번 포스팅에서는 클립보드를 통해 인식하기 어려문 문자를 가져와보겠다.
1. Android 기기의 클립보드 접근 방법
1-1. ADB를 통한 클립보드 접근
- ADB 명령어를 사용하여 클립보드에 접근할 수 있다.
- shell input clipboard get
- 하지만 Android 9부터 보안 정책 변화로 인해 ADB를 통한 클립보드 읽기가 제한됨
1-2. ClipboardManager를 통한 접근
- Android SDK에서 지원하는 ClipboardManager를 통해 클립보드에 접근할 수 있다.
- 하지만 Android Studio와 Android SDK가 필요하며, 현재 개발환경인 IntelliJ에서는 사용할 수 없음.
하지만 나의 경우는 PC에서 앱플레이어를 통해 디바이스를 조작하므로 클립보드가 동기화 되는 것으로 확인됬다. 따라서 JAVA의 AWT를 통해 클립보드에 접근하도록 하겠다.
2. Java AWT를 통한 클립보드 접근
2-1. 클립보드 접근
코드
package com.coffebara.summaryBot.utils;
import lombok.extern.slf4j.Slf4j;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
@Slf4j
public class ClipboardUtil {
/**
* 디바이스에서 copy한 userId를 가져오는 메서드
*
* @return clipboardText
*/
public static String getClipboard() {
// Headless 모드인지 확인
if (GraphicsEnvironment.isHeadless()) {
log.error("클립보드 접근이 불가능한 환경입니다.");
return ""; // 빈 문자열 반환
}
// 클립보드 객체 가져오기
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 클립보드에서 데이터 가져오기
Transferable contents = clipboard.getContents(null);
String clipboardText = "";
try {
// 텍스트 데이터가 있는지 확인
if (contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
clipboardText = (String) contents.getTransferData(DataFlavor.stringFlavor);
log.info("클립보드 내용: " + clipboardText);
return clipboardText;
} else {
log.error("클립보드에 텍스트가 없습니다.");
}
} catch (Exception e) {
e.printStackTrace();
}
return clipboardText;
}
}
- pasteFromClipboard(): 클립보드에서 문자열 데이터를 읽어옵니다.
- DataFlavor.stringFlavor: 클립보드에서 가져올 데이터가 문자열임을 확인하는 데 사용됩니다.
2-2. Headless 모드 확인
- Java AWT는 Headless 모드에서 관련 기능이 접근되어 클립보드 접근도 불가능해진다. 따라서 현재 환경이 Headless인지 확인할 필요가 있다.
HeadLess 모드란
Headless 모드는 서버나 CLI(명령줄 인터페이스) 환경에서 GUI 없이 Java 애플리케이션을 실행하는 모드입니다. 이는 그래픽 장치 없이도 Java 애플리케이션을 실행할 수 있게 하며, 주로 서버 환경에서 사용됩니다.
- 아래의 코드로 Headless 모드를 확인할 수 있다.
GraphicsEnvironment.isHeadless()
2-3. Headless 모드 비활성
Headless 모드를 변경하는 방법은 jvm 옵션에 -Djava.awt.headless=false 를 추가하면 된다.
나는 gradle을 통해 다음과 같이 바꿔주었다.
//클립보드 접근을 위한 headless 설정
tasks.withType(JavaExec).configureEach {
jvmArgs '-Djava.awt.headless=false'
}
test {
useJUnitPlatform()
// JVM 옵션 설정
jvmArgs '-Djava.awt.headless=false'
// 테스트 로그 출력 (선택 사항)
testLogging {
events "passed", "failed", "skipped"
}
}
테스트 코드
@SpringBootTest
class ClipboardUtilTest {
@MockBean
private SummaryBotRunner summaryBotRunner; // SummaryBotRunner 빈을 Mock으로 대체
@Test
@DisplayName("클립보드 접근 테스트")
void getClipboardTest() throws Exception {
//given
String text = "ᴰᴹ Jake"; //위첨자가 포함된 문자
//when
String clipboardText = ClipboardUtil.getClipboard();
//then
assertEquals(text, clipboardText);
}
}
결과
2024-10-05T21:57:50.067+09:00 INFO 29472 --- [summaryBot] [ Test worker] c.c.summaryBot.utils.ClipboardUtil : 클립보드 내용: ᴰᴹ Jake
ClipboardUtilTest > 클립보드 접근 테스트 PASSED
BUILD SUCCESSFUL in 7s
참고
https://source.android.com/docs/security/enhancements/enhancements10?hl=ko#privacy
'Backend > 프로젝트' 카테고리의 다른 글
웹 서버 자동 점검 (2) | 2024.11.04 |
---|---|
갈아만든 임원 - 8 엑셀 데이터 입력 (0) | 2024.10.06 |
갈아만든 임원 - 6 데이터 추출하기2 OpenCV 전처리 작업 (2) | 2024.09.25 |
갈아만든 임원 - 5 데이터 추출하기2 OpenCV 설치 (1) | 2024.09.25 |
갈아만든 임원 - 4 데이터 추출하기 (Tesseract OCR) (0) | 2024.09.23 |