Files
sodalive-android/docs/20260324_라이브룸화면캡쳐녹화차단처리.md

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, readLiveRoomActivity, Agora.kt, BaseActivity, AndroidManifest.xml 확인.
      • 배경 탐색: explore 3건(bg_7ba54780, bg_885fde99, bg_bbf958e8), librarian 2건(bg_ad1f9b7a, bg_486409ac) 결과 수집.
      • API 레벨 검증: /Users/klaus/Library/Android/sdk/platforms/android-35/data/api-versions.xml에서 addScreenRecordingCallback/removeScreenRecordingCallback/SCREEN_RECORDING_STATE_VISIBLEsince="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 진단: .kt LSP 서버 미구성으로 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.
  • 2026-03-24
    • 무엇: 사용자 요청에 맞춰 캡처/녹화 관련 추가 코드 전반에 의미 단위 주석을 보강했다.
    • 왜: API 레벨 분기(34/35), 콜백 등록/해제 대칭, 강제 mute 원복 의도를 유지보수 시 즉시 파악할 수 있도록 하기 위해서다.
    • 어떻게:
      • LiveRoomActivity.kt의 신규 상태 변수, 라이프사이클 훅, 콜백 등록/해제, 강제 mute 계산/적용 함수에 한 문장 주석을 추가했다.
      • AndroidManifest.xmlDETECT_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.