재미있는 이미지, 유익한 동영상, 매력적인 오디오 클립 등 사용자가 콘텐츠를 공유할 수 있도록 하면 사용자의 경험이 풍부해지고 참여도가 높아집니다. 이 문서에서는 이 기능을 통합하는 데 필요한 API 및 기법을 비롯하여 Android에서 미디어를 공유하는 데 필요한 기본사항을 살펴봅니다.
공유를 위한 설계
Android의 설계는 인텐트에 기반한 시스템을 사용하여 앱 간의 상호 운용성을 촉진합니다. 인텐트는 실행할 작업에 관한 추상적인 설명입니다. 인텐트를 사용하면 앱이 알지 못하는 사이에 서로 통신할 수 있음 알게 될 것입니다.
앱이 데이터를 공유하거나 작업을 시작하려면 콘텐츠 및 작업 유형을 지정하는 인텐트를 만듭니다. Android 시스템은 사용자가 인텐트를 처리할 수 있는 관련 앱의 목록을 정의합니다. 이러한 접근 방식은 공동작업 생태계를 조성합니다.
텍스트를 공유하려면 코드 몇 줄만 있으면 됩니다.
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "This is my text to share.")
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)
createChooser 선에는 사용자가 한 번의 탭으로 관련 앱 제안을 비롯한 정보를 다른 사용자와 공유할 수 있는 Android Sharesheet UI가 표시됩니다. Android Sharesheet로 할 수 있는 다른 작업은 다음과 같습니다.
Android에 관한 자세한 내용은 다른 앱에 간단한 데이터 보내기를 참고하세요. Sharesheet 및 사용 방법
Direct Share 타겟을 제공하여 다른 앱 사용자가 앱과 URL, 이미지 또는 기타 유형의 데이터를 더 쉽고 빠르게 공유할 수 있도록 합니다. Direct Share는 사용자가 앱을 선택한 다음 연락처를 검색하지 않아도 Android Sharesheet에 메시지 및 소셜 앱의 연락처를 직접 표시하여 작동합니다.
다음을 통해 리치 콘텐츠 수신 지원:
OnReceiveContentListener 이 API를 사용하면 한곳에서
코드가 지정된 일반 텍스트와 스타일이 지정된 텍스트에서 마크업에 이르기까지 모든 콘텐츠 수신을 처리할 수 있습니다.
이미지, 동영상, 오디오 파일 등이 포함됩니다. 콘텐츠는 이미지 키보드, 드래그 앤 드롭 또는 클립보드에서 가져올 수 있습니다.
미디어 파일 공유
인텐트는 소량의 데이터만 포함할 수 있으므로 Android에서는 인텐트에 파일의 안전한 핸들을 포함하는 방법을 제공합니다. 앱에서 미디어 파일을 안전하게 공유하려면 다음이 필요합니다.
- 파일에 안전한 핸들을 제공하도록 앱을 구성합니다.
콘텐츠 URI: Android
FileProvider구성요소를 사용합니다. - 매니페스트에서 공유 가능 디렉터리를 지정합니다.
getUriForFile를 사용하여 보안 기능을 하는 콘텐츠 URL을 만듭니다. 파일에 핸들을 추가합니다.- 파일에 권한을 부여하는 인텐트를 만듭니다.
안전하게 공유하는 방법에 관한 자세한 내용은 파일 공유 정보를 참고하세요. 할 수 있습니다.
미디어 공유 최적화
앱에서 다른 사용자와 미디어를 공유하는지, 아니면 고품질 콘텐츠를 제공하는 미디어를 공유하려고 할 때 알게 되었습니다.
품질과 크기 간의 균형 유지
대용량 미디어 파일은 대역폭과 스토리지를 빠르게 소모하여 사용자에게 불편을 끼치는 지연과 잠재적인 데이터 초과 요금이 발생할 수 있습니다. 압축이 가장 중요합니다.
- 이미지 압축: 다음과 같이 최신 이미지 압축 형식을 활용합니다. WebP 및 AVIF는 기존 이미지 버전에 비해 뛰어난 압축률을 제공합니다. JPEG를 사용할 수 있습니다. 다양한 품질로 실험 최적의 균형을 찾아보세요.
- 동영상 압축: AV1 또는 H.265(HEVC) 동영상 압축의 성능을 활용하여 우수한 시각적 품질을 유지하면서 더 나은 압축 효율을 제공합니다. 이때 사용 중인 하드웨어 인코딩이 있는지
Android 10 이상 기기 및
mediaPerformanceClass기기에서 가장 잘 지원할 수 있는 것이 무엇인지 확인하세요. 다른 솔루션과 다양한 사용자 환경설정 및 네트워크에 적합한 해상도 옵션을 제공합니다. 조건일 수 있습니다
fun hasHardwareEncodingSupportFor(mimeType: String): Boolean {
val codecList = MediaCodecList(REGULAR_CODECS)
val codecInfos = codecList.codecInfos
for ( codecInfo in codecInfos ) {
if (!codecInfo.isEncoder()) {
continue;
}
if (!codecInfo.isHardwareAccelerated()) {
continue;
}
val types: Array<String> = codecInfo.getSupportedTypes()
for (j in types.indices) {
if (types[j].equals(mimeType, ignoreCase = true)) {
return true
}
}
}
return false
}
// test for AV1 hardware encoding support
val hasAV1 = hasHardwareEncodingSupportFor("video/av01")
미디어 조정 중
소셜 미디어 플랫폼에서는 주로 동영상에 특정 크기 및 가로세로 비율을 공유할 수 있습니다. 공유하기 전에 미리 미디어 파일의 크기를 조절하고 자르기하면 사용자가 좋아하는 플랫폼에 게시할 때 예기치 않은 왜곡이나 형식 지정 문제가 발생하지 않습니다.
사용자가 미디어를 최적화할 수 있는 방법에 대한 명확한 안내 및 가이드 제공 공유할 수 있습니다. 여기에는 인코딩 비트 전송률 조정, 정량화 매개변수 설정, 동영상 형식 선택, 적절한 파일 크기 선택, 다양한 공유 옵션의 영향 이해에 관한 팁이 포함될 수 있습니다.
미디어 검색 가능성 개선
제목, 설명, 태그와 같은 관련 메타데이터를 미디어에 추가 파일의 검색 가능성을 높일 수 있습니다. 사용자가 공유할 때 직접 설명과 자막을 추가하여 환경을 더욱 맞춤설정하도록 독려하세요.
이미지에 메타데이터 추가
Jetpack ExifInterface 클래스는 메타데이터를 JPEG, PNG, WebP에 씁니다. Exif 태그 형식으로 이미지를 캡처합니다.
// sets the title of the image in the form of Exif data
val exif = ExifInterface(imageFile)
exif.setAttribute(ExifInterface.TAG_IMAGE_DESCRIPTION, "Beautiful sunset")
exif.saveAttributes()