안녕하세요. 메로나입니다.
오늘은 미디어 프로젝션에 관해 공부하겠습니다.
미디어 프로젝션이란?
- 화면 캡처와 녹화를 가능하게 해주는 기능
- 사용자의 디스플레이 콘텐츠를 다른 애플리케이션이나 서비스로 스트리밍 하거나 저장
미디어 프로젝션 특징
- 화면 캡처 및 녹화: 사용자의 동의 하에 현재 디스플레이에 표시되는 모든 내용을 캡처하거나 녹화할 수 있음
- 보안 및 프라이버시: 사용자 권한을 필수적으로 요구하여 민감한 정보의 무단 캡처를 방지
미디어 프로젝션 사용 방법
- 권한 요청: MediaProjectionManager를 통해 사용자에게 화면 캡처 권한을 요청
- 콜백 처리: 사용자가 권한을 승인하면 onActivityResult 메서드에서 이를 처리
- 가상 디스플레이 생성: MediaProjection 객체를 사용하여 가상 디스플레이를 생성하고, 이를 통해 화면 데이터를 수집
주의사항
- 성능 고려: 화면 캡처와 녹화는 많은 시스템 자원을 소모하므로, 최적화에 신경 써야 함
- 사용자 경험: 권한 요청 시 명확한 설명을 제공하여 사용자가 기능의 목적을 이해하고 승인할 수 있도록 해야 함.
포그라운드 서비스 권한
- android 14 이상을 타켓팅하는 경우 앱 매니페스트에 mediaProjection 포그라운드 서비스 유형의 권한 선언이 포함되어야 함.
- 앱 매니페스트에 mediaProjection 포그라운드 서비스 권한 선언 후 startForeground()를 호출하여 미디어 프로젝션 서비스를 시작함.
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
<application ...>
<service
android:name=".MyMediaProjectionService"
android:foregroundServiceType="mediaProjection"
android:exported="false">
</service>
</application>
</manifest>
android 15 QPR1부터 상태 표시줄 칩 및 자동 중지 기능

android Target Preview Barklava를 적용하면 화면 공유 시 위와 같은 상태표시줄을 볼 수 있습니다.
해당 상태표시줄에 위치한 버튼을 누를 경우 공유 중지할 건지 팝업창이 뜹니다.
해당 Callback에 대해 대처하지 않으면 앱이 오작동을 할 것이기 때문에 앞으로 업데이트 방향에 따라 대처해야 할 것 같습니다.

// 콜백 구현
import android.media.projection.MediaProjection;
import android.util.Log;
public class MyMediaProjectionCallback extends MediaProjection.Callback {
@Override
public void onStop() {
// 화면 프로젝션이 중지될 때 호출됩니다.
Log.d("MyMediaProjectionCallback", "MediaProjection has stopped.");
// 리소스 해제 로직을 여기에 추가하세요.
// 예: 가상 디스플레이 해제, MediaRecorder 정지 등
releaseResources();
// UI 업데이트 로직을 여기에 추가하세요.
// 예: 화면 공유 중지 알림 표시 등
updateUI();
}
private void releaseResources() {
// 리소스 해제 로직 구현
}
private void updateUI() {
// UI 업데이트 로직 구현
}
}
// 콜백 등록
import android.media.projection.MediaProjection;
public class MyActivity extends Activity {
private MediaProjection mediaProjection;
private MyMediaProjectionCallback callback;
private void startScreenProjection() {
// MediaProjection 초기화 및 시작 로직
// ...
// 콜백 인스턴스 생성
callback = new MyMediaProjectionCallback();
// 콜백 등록
mediaProjection.registerCallback(callback, null);
}
}
참고문헌
미디어 프로젝션 | Android media | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 미디어 프로젝션 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 5 (API 수준 21)에 도입된 android.me
developer.android.com
'Android' 카테고리의 다른 글
| [Android] NDK(Native Development Kit) (0) | 2025.04.06 |
|---|---|
| [Android] Context (0) | 2025.04.06 |
| [Android] AOSP(Android Open Source Project) (0) | 2025.03.07 |
| [Android] 안드로이드 리다이렉션 처리 (0) | 2025.02.28 |
| [Android] Android App Bundle(AAB) (0) | 2025.01.26 |
