이노베이팅 컨설팅 신청하기 (클릭)
logo
|
Blog

    앱 MVP Android 공유 기능: 발신·수신·파일 권한·완료 신호를 나누는 5가지 기준

    Android MVP에서 Sharesheet 발신과 외부 콘텐츠 수신, MIME type, URI 권한, 사용자 확인과 QA 경계를 정리합니다.
    Sep 21, 2026
    앱 MVP Android 공유 기능: 발신·수신·파일 권한·완료 신호를 나누는 5가지 기준

    Android 앱 MVP에 ‘공유하기’ 버튼을 넣는 일은 보통 짧은 Intent 코드로 시작합니다. 하지만 실제로는 사용자가 다른 앱에 보내려는지, 우리 앱이 외부 콘텐츠를 받아야 하는지, 파일을 얼마나 오래 열어둘지, 사용자가 무엇을 확인한 뒤 저장할지를 먼저 나누어야 합니다. 버튼이 열렸거나 대상 앱을 선택했다는 사실은 공유 내용이 전달·저장·게시됐다는 결과와 다릅니다.

    Android Developers는 다른 앱 또는 다른 사람에게 콘텐츠를 보낼 때 Android Sharesheet를 권장하고, 다음 단계가 명확한 작업에는 intent resolver를 구분해 설명합니다. 이 글은 그 차이를 제품 요구사항과 QA 항목으로 옮기는 방법입니다. 특정 스토어 심사, 보안 수준, 사용자 행동 결과를 보장하지 않습니다.

    먼저 답: ‘보내기’와 ‘받기’는 같은 기능이 아닙니다

    보내기는 우리 앱이 콘텐츠의 형태와 목적을 정해 시스템 선택 화면으로 넘기는 흐름입니다. 받기는 다른 앱이 건넨 내용을 우리 앱이 열기 전에 허용 범위와 다음 화면을 결정하는 흐름입니다. 둘 다 Intent를 쓰지만, 실패 모습과 책임이 다릅니다.

    구분

    먼저 정할 질문

    완료로 보지 말아야 할 것

    발신

    링크·텍스트·파일 중 무엇을 보내는가

    공유 시트가 열림

    수신

    어떤 action·MIME type만 받는가

    앱이 선택 목록에 보임

    파일

    어떤 URI를 언제까지 읽게 하는가

    URI를 extra에 넣음

    화면

    사용자가 내용을 확인·수정할 기회가 있는가

    외부 입력을 즉시 저장

    업무

    외부 앱에서의 후속 행동을 알 수 있는가

    대상 앱 선택

    예를 들어 기사 링크를 친구에게 보내는 기능과, 사용자가 다른 앱에서 보낸 이미지를 우리 앱에 임시 첨부하는 기능은 요구사항을 섞으면 안 됩니다. 전자는 보내는 내용과 대상 선택 경험이, 후자는 수신 허용 범위·검사·임시 보관이 중심입니다.

    기준 1: 시스템 Sharesheet와 특정 작업 연결을 구분합니다

    Android 공식 가이드는 Android Sharesheet를 앱 밖으로 콘텐츠를 보내거나 다른 사람과 공유하는 용도로 설명하며, 직접 만든 대상 목록보다 일관된 경험을 위해 이를 사용하도록 권장합니다. 반대로 PDF를 열어 볼 앱처럼 다음 단계가 명확한 작업에는 intent resolver가 맞을 수 있습니다.

    따라서 요구사항에는 ‘공유’라는 단어 하나 대신 목적을 적으세요. “사용자가 현재 링크를 원하는 앱으로 보낸다”와 “사용자가 선택한 PDF viewer에서 문서를 연다”는 전혀 다른 시나리오입니다. 전자는 Intent.createChooser()로 시스템 Sharesheet를 열고, 후자는 지원 앱을 고르는 resolver 흐름을 검토할 수 있습니다. 어느 쪽도 상대 앱에서 실제 전송이나 업로드가 끝났음을 자동으로 증명하지는 않습니다.

    기준 2: 내용 형식은 넓게 잡기보다 정확히 적습니다

    발신 시 Android는 ACTION_SEND와 extra, MIME type으로 호환 가능한 수신 Activity를 찾습니다. 텍스트라면 text/plain, 이미지라면 실제 이미지 형식처럼 가능한 한 구체적인 MIME type을 사용하고, 모든 타입을 뜻하는 */*는 피하라는 것이 공식 가이드의 방향입니다.

    수신도 마찬가지입니다. 우리 앱이 URL 텍스트만 처리한다면 이미지·동영상까지 한꺼번에 등록할 이유가 없습니다. Android는 manifest의 <intent-filter>에 action과 MIME type을 선언해 수신 대상을 표시하도록 안내합니다. Compose Navigation을 쓴다면 action과 MIME type에 맞는 navDeepLink를 목적 화면에 연결하는 방법도 공식 문서에 나와 있습니다.

    이 경계는 기능을 적게 만들자는 뜻이 아닙니다. “무엇을 받을 수 있는가”와 “받은 뒤 어떤 화면에서 편집·확인할 것인가”를 한 문장으로 합치지 않기 위한 장치입니다. 링크 입력만 지원하는 초기 버전이라면 이미지 수신을 열어 두지 말고, 이미지가 필요해질 때 검증·미리보기·오류 안내를 같이 추가하세요.

    앱 MVP의 외부 연동 범위와 QA 기준 함께 점검하기

    기준 3: 파일을 보내는 것과 읽을 권한을 주는 것을 분리합니다

    이미지나 문서 같은 binary content는 EXTRA_STREAM에 URI를 넣고 적절한 MIME type을 정하는 방식으로 보낼 수 있습니다. 다만 URI가 있다고 해서 수신 앱이 파일을 읽을 수 있는 것은 아닙니다. Android는 수신 애플리케이션에 URI 접근 권한이 필요하다고 안내하며, FileProvider와 per-URI permission을 임시 접근에 쓰는 방식을 제시합니다.

    제품 문서에는 파일의 실체와 권한 수명을 따로 남기세요. 원본이 앱 전용 파일인지, 공유 전 복사본인지, 대상 앱이 읽을 수 있는 URI인지, 사용자가 취소했을 때 임시 파일을 어떻게 다룰지 같은 질문입니다. 사용자가 기기에서 문서를 고르는 흐름까지 포함한다면 앱 MVP 문서 첨부의 선택·권한·재접근 기준과도 구분해 보세요. MediaStore에 넣은 콘텐츠는 다른 앱 접근 범위와도 연결될 수 있으므로, ‘공유 버튼이 있다’는 이유만으로 저장 위치를 정하지 않습니다.

    공유 대상 선택과 파일 읽기 가능은 다른 상태입니다. 더 나아가 수신 앱에서 사용자가 파일을 실제로 열었는지, 내용을 전송했는지는 발신 앱이 일반적으로 같은 의미로 볼 수 없습니다. 분석 이벤트를 둔다면 Sharesheet 표시, 대상 선택 콜백, 우리 서비스의 업로드 완료처럼 관찰 가능한 이벤트 이름과 범위를 나눕니다.

    기준 4: 수신 입력은 바로 실행하지 말고 검사·확인을 둡니다

    Android 공식 수신 가이드는 다른 앱이 보내는 입력을 주의 깊게 확인하라고 말합니다. MIME type이 잘못 지정될 수 있고, 이미지는 지나치게 클 수 있으며, binary data는 UI thread 밖에서 처리해야 한다는 점도 함께 안내합니다. 그래서 MVP라도 수신 화면에서 다음 순서를 분리하는 편이 좋습니다.

    1. action·MIME type이 선언한 범위와 맞는지 확인합니다.

    2. 텍스트·URI·파일 메타데이터를 읽을 수 있는지 확인합니다.

    3. 사용자가 볼 수 있는 미리보기 또는 요약과 취소·수정 경로를 제공합니다.

    4. 검증을 통과한 내용만 앱 내부 작업으로 넘깁니다.

    5. 저장·업로드·생성 같은 업무 결과는 별도 상태로 보여 줍니다.

    공식 가이드도 특정 Activity를 탭한 사용자가 공유 콘텐츠를 확인하고 편집할 수 있어야 한다고 설명합니다. 특히 텍스트는 외부 앱이 넣은 문자열을 그대로 게시·전송하는 대신, 목적 화면에서 사용자가 내용을 보고 결정하게 만드는 편이 낫습니다. 이는 입력을 신뢰한다는 선언이 아니라, 사용자 의도와 앱 내부 처리의 경계를 보이는 UX입니다.

    기준 5: 중첩 Intent와 다음 화면 실행은 별도의 보안 검토 항목입니다

    수신 Intent 안에 또 다른 Intent가 들어 있고 이를 곧바로 startActivity()·startService() 등에 넘기는 흐름은 단순한 파일 수신보다 더 주의가 필요합니다. Android의 intent redirection 가이드는 중첩 Intent를 unpackage한 뒤 즉시 실행하는 경우를 안전하지 않은 실행 패턴으로 다루며, Android 16의 기본 보안 강화와 예외 해제의 위험을 설명합니다.

    MVP에서 해야 할 일은 복잡한 보안 문구를 붙이는 것이 아닙니다. 어떤 component·data·type만 허용할지, 외부 입력을 앱 내부 Intent로 변환할 때 무엇을 다시 확인할지, 지원하지 않는 입력에는 어느 화면을 보여 줄지를 명시하는 것입니다. IntentSanitizer처럼 허용 항목을 좁히는 도구도 공식 문서가 제시하지만, 실제 적용 범위는 앱의 target SDK와 흐름에 맞춰 테스트해야 합니다.

    QA 층

    확인할 시나리오

    통과 기준 예시

    발신

    텍스트·이미지·지원하지 않는 타입

    선언한 타입만 올바른 선택 화면으로 전달

    URI

    대상 앱 접근·취소·재시도

    필요한 범위에서만 읽고 실패를 안내

    수신

    비어 있는 값·다른 MIME type·큰 파일

    앱이 멈추지 않고 사용자가 다음 행동을 알 수 있음

    확인

    외부 텍스트·이미지 미리보기

    저장·전송 전 사용자 확인 또는 취소 경로 제공

    보안

    중첩 Intent·예상 밖 component

    허용 범위 밖 실행을 하지 않고 안전한 화면으로 복귀

    공유 기능을 ‘Intent 한 줄’로 닫지 않으면, 다음 스프린트에서 파일 수명·입력 검증·사용자 확인·업무 완료를 각자 측정하고 수정할 수 있습니다. 이 경계가 있어야 단순한 대상 앱 선택을 사용자 콘텐츠 처리 완료나 우리 서비스의 성과로 잘못 읽지 않게 됩니다.

    공유·외부 연동·출시 QA가 맞물리는 앱 MVP 설계하기

    공식 출처

    • Android Developers: Send data to other apps (2026-09-21 직접 확인)

    • Android Developers: Receive simple data from other apps (2026-09-21 직접 확인)

    • Android Developers: Intent redirection (2026-09-21 직접 확인)

    자주 묻는 질문

    Sharesheet가 열리면 공유가 성공한 것인가요?

    아닙니다. Sharesheet가 열렸다는 것은 사용자가 대상 앱을 고를 수 있는 상태가 됐다는 뜻입니다. 상대 앱에서 전송·업로드·게시가 끝났는지는 별도 결과이며, 제품이 관찰할 수 있는 범위도 흐름에 따라 다릅니다.

    파일 URI만 넣으면 다른 앱이 파일을 읽을 수 있나요?

    그렇게 단정할 수 없습니다. Android는 수신 앱이 URI를 읽을 권한이 필요하다고 안내합니다. 어떤 URI를 쓸지와 어떤 범위·기간에 접근을 허용할지는 파일 수명 정책과 함께 설계해야 합니다.

    수신 Intent에서 모든 MIME type을 허용해도 되나요?

    앱이 실제로 처리할 수 있는 타입만 허용하는 편이 좋습니다. Android 공식 문서도 */*처럼 지나치게 넓은 MIME type은 앱이 모든 입력을 처리할 수 있는 경우가 아니라면 권장하지 않습니다.

    외부 앱이 준 텍스트를 바로 게시해도 되나요?

    외부 입력을 받는 화면에서 사용자가 내용을 확인·수정·취소할 기회를 두는 편이 좋습니다. 입력을 받았다는 사실과 우리 앱에서 저장·게시 같은 후속 업무를 완료했다는 사실도 분리해 표시하세요.

    발행일: 2026-09-21 · 작성: 유인어스 정책자금·정부지원사업 인사이트

    Share article
    유인어스 정책자금·혁신기업 전환 컨설팅

    유인어스는 주식회사 넥스트빌더가 운영하는 정책자금 및 혁신기업 전환 컨설팅 브랜드입니다. 기업의 업종·업력·재무상태를 진단해 적합한 정책금융기관과 준비 절차를 안내합니다.

    유인어스 홈 컨설팅 신청 RSS