5.5 KiB
5.5 KiB
20260324 라이브룸 화면 캡쳐/녹화 차단 처리 계획
구현 체크리스트
- LiveRoomActivity의 기존 오디오 음소거/복원 흐름을 탐색해 캡쳐/녹화 감지 시 재사용 지점을 확정한다. (QA: 기존
muteAllRemoteAudioStreams/마이크 음소거 관련 코드 경로 확인) - 화면 캡쳐/녹화 시작 상태를 감지하는 Android API 적용 방식을 확정한다. (QA: 코드베이스 탐색 + 공식 문서 근거 확인)
- 감지 시 캡쳐 결과 배경이 검정색이 되도록 처리한다. (QA:
FLAG_SECURE또는 동등 보호 처리 코드 반영 확인) - 감지 시 음소거가 적용되고 종료 시 원복되도록 처리한다. (QA: 상태 플래그 기반 mute/unmute 분기 확인)
- 수정 코드 진단/테스트/빌드/수동 검증 결과를 기록한다. (QA: 실행 명령과 결과 로그 확인)
검증 기록
- 2026-03-24
- 무엇: 작업 계획 문서를 생성하고 구현/검증 체크리스트를 정의했다.
- 왜: 구현 범위와 완료 기준을 명확히 고정한 상태에서 안전하게 변경하기 위해서다.
- 어떻게:
docs/20260324_라이브룸화면캡쳐녹화차단처리.md파일을 생성해 체크박스와 QA 기준을 작성했다.
- 2026-03-24
- 무엇: 코드베이스/외부 문서 병렬 탐색으로 캡쳐·녹화 보호 및 음소거 적용 근거를 확정했다.
- 왜: 기존 구현 패턴과 Android/Agora API 제약을 확인한 뒤 안전한 최소 변경으로 적용하기 위해서다.
- 어떻게:
- 코드 탐색:
grep,ast_grep_search,sg run,read로LiveRoomActivity,Agora.kt,BaseActivity,AndroidManifest.xml확인. - 배경 탐색:
explore3건(bg_7ba54780,bg_885fde99,bg_bbf958e8),librarian2건(bg_ad1f9b7a,bg_486409ac) 결과 수집. - API 레벨 검증:
/Users/klaus/Library/Android/sdk/platforms/android-35/data/api-versions.xml에서addScreenRecordingCallback/removeScreenRecordingCallback/SCREEN_RECORDING_STATE_VISIBLE가since="35"임을 확인.
- 코드 탐색:
- 2026-03-24
- 무엇: LiveRoomActivity에 캡쳐/녹화 보안 처리와 음소거 동기화 로직을 구현했다.
- 왜: 화면 캡쳐/녹화 시 민감 화면이 노출되지 않고 오디오가 즉시 음소거되도록 하기 위해서다.
- 어떻게:
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)를onCreate에 추가해 캡쳐 결과 비표시(검정/빈 화면) 처리.- API 34+
registerScreenCaptureCallback(스크린샷), API 35+addScreenRecordingCallback(녹화 상태) 등록/해제 로직을onStart/onStop에 추가. isCapturePrivacyMuted,isScreenRecordingActive,isScreenshotMuteActive상태를 기반으로agora.muteLocalAudioStream/agora.muteAllRemoteAudioStreams를 일괄 적용하고 종료 시 원복.- 기존 마이크/스피커 토글 로직을
applyEffectiveAudioMuteState()로 통합해 UI/실제 mute 상태를 동기화.
- 2026-03-24
- 무엇: 스크린샷/녹화 감지 콜백 동작을 위한 권한을 Manifest에 반영했다.
- 왜: Android 14+ 스크린샷 감지와 Android 15+ 녹화 상태 감지 콜백의 권한 요구사항을 충족하기 위해서다.
- 어떻게:
app/src/main/AndroidManifest.xml에<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />,<uses-permission android:name="android.permission.DETECT_SCREEN_RECORDING" />를 추가했다.
- 2026-03-24
- 무엇: 구현 완료 후 Oracle 리뷰로 API/권한 회귀 위험을 점검하고 보완 반영했다.
- 왜:
addScreenRecordingCallback사용 시 Android 15 권한 누락으로 인한SecurityException가능성을 제거하기 위해서다. - 어떻게: Oracle 결과(
ses_2e18fd285ffefWU6DrqSIJbgWY)를 수집해DETECT_SCREEN_RECORDING권한을 추가하고 재빌드/재검증했다.
- 2026-03-24
- 무엇: 수정분 정합성 검증(진단/테스트/빌드/수동 QA)을 수행했다.
- 왜: 컴파일 안정성과 요구사항 반영 여부를 객관적으로 확인하기 위해서다.
- 어떻게:
- LSP 진단:
.ktLSP 서버 미구성으로lsp_diagnostics실행 불가 확인. - 실행 명령:
./gradlew :app:testDebugUnitTest :app:assembleDebug - 결과:
BUILD SUCCESSFUL(수정 단계별 반복 실행 모두 성공, 기존 Gradle deprecation/namespace 경고만 존재) - 수동 QA 명령:
python3스크립트로FLAG_SECURE, API 34/35 콜백 등록/해제, 캡쳐 기반 음소거 동기화, Manifest 권한 선언을 검증. - 수동 QA 결과:
MANUAL QA PASS: capture/record security + mute flow + required permissions verified from source.
- LSP 진단:
- 2026-03-24
- 무엇: 사용자 요청에 맞춰 캡처/녹화 관련 추가 코드 전반에 의미 단위 주석을 보강했다.
- 왜: API 레벨 분기(34/35), 콜백 등록/해제 대칭, 강제 mute 원복 의도를 유지보수 시 즉시 파악할 수 있도록 하기 위해서다.
- 어떻게:
LiveRoomActivity.kt의 신규 상태 변수, 라이프사이클 훅, 콜백 등록/해제, 강제 mute 계산/적용 함수에 한 문장 주석을 추가했다.AndroidManifest.xml의DETECT_SCREEN_CAPTURE/DETECT_SCREEN_RECORDING권한 선언 위에 목적 주석을 추가했다.- 실행 명령:
./gradlew :app:testDebugUnitTest :app:assembleDebug - 결과:
BUILD SUCCESSFUL - 수동 QA 명령:
python3스크립트로 주석 반영 지점을 점검. - 수동 QA 결과:
MANUAL QA PASS: meaning-unit comments added for all capture/recording additions.