본문 바로가기

Android

[Android] 미디어 프로젝션(Media Projection)

안녕하세요. 메로나입니다.

 

오늘은 미디어 프로젝션에 관해 공부하겠습니다.

 

미디어 프로젝션이란?
  • 화면 캡처와 녹화를 가능하게 해주는 기능
  • 사용자의 디스플레이 콘텐츠를 다른 애플리케이션이나 서비스로 스트리밍 하거나 저장
미디어 프로젝션 특징
  • 화면 캡처 및 녹화: 사용자의 동의 하에 현재 디스플레이에 표시되는 모든 내용을 캡처하거나 녹화할 수 있음
  • 보안 및 프라이버시: 사용자 권한을 필수적으로 요구하여 민감한 정보의 무단 캡처를 방지
미디어 프로젝션 사용 방법
  1. 권한 요청: MediaProjectionManager를 통해 사용자에게 화면 캡처 권한을 요청
  2. 콜백 처리: 사용자가 권한을 승인하면 onActivityResult 메서드에서 이를 처리
  3. 가상 디스플레이 생성: 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 미디어프로젝션 - 상태표시줄

android Target Preview Barklava를 적용하면 화면 공유 시 위와 같은 상태표시줄을 볼 수 있습니다.

해당 상태표시줄에 위치한 버튼을 누를 경우 공유 중지할 건지 팝업창이 뜹니다.

해당 Callback에 대해 대처하지 않으면 앱이 오작동을 할 것이기 때문에 앞으로 업데이트 방향에 따라 대처해야 할 것 같습니다.

android 미디어프로젝션 - 상태표시줄 내용

 

// 콜백 구현
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);
    }
}

 

참고문헌

https://developer.android.com/media/grow/media-projection?hl=ko#:~:text=%EB%AF%B8%EB%94%94%EC%96%B4%20%ED%94%84%EB%A1%9C%EC%A0%9D%EC%85%98%EC%9D%80%20%EA%B8%B0%EA%B8%B0%20%EB%94%94%EC%8A%A4%ED%94%8C%EB%A0%88%EC%9D%B4,%EA%B0%80%EC%83%81%20%EB%94%94%EC%8A%A4%ED%94%8C%EB%A0%88%EC%9D%B4%EC%97%90%20%ED%94%84%EB%A1%9C%EC%A0%9D%EC%85%98%ED%95%A9%EB%8B%88%EB%8B%A4.

 

미디어 프로젝션  |  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