미디어 공유 정보

재미있는 이미지, 유용한 동영상, 매력적인 오디오 클립 등 사용자가 콘텐츠를 공유할 수 있도록 하면 사용자의 경험이 풍부해지고 참여도가 높아집니다. 이 문서에서는 Android에서 미디어 공유의 기본사항을 살펴봅니다. 여기에는 이 기능을 통합하는 데 필요한 API와 기법이 포함됩니다.

공유를 위한 설계

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 및 사용 방법

직접 공유 타겟을 제공하여 사용자가 더 쉽고 빠르게 앱과 URL, 이미지 또는 다른 종류의 데이터를 공유합니다. 직접 공유는 메시지 및 소셜 앱에서 연락처를 바로 표시하는 방식으로 작동합니다. 사용자가 앱을 선택한 다음 Android Sharesheet에서 연락처를 검색합니다.

다음을 통해 리치 콘텐츠 수신 지원: OnReceiveContentListener 이 API는 일반 텍스트와 스타일이 지정된 텍스트부터 마크업, 이미지, 동영상, 오디오 파일 등에 이르기까지 코드에서 모든 콘텐츠 수신을 처리하는 단일 장소를 제공합니다. 콘텐츠의 출처는 이미지 드래그 앤 드롭, 클립보드 등의 도구를 이용할 수도 있습니다

미디어 파일 공유

인텐트는 소량의 데이터만 포함할 수 있으므로 Android는 파일에 대한 보안 핸들을 포함하는 인텐트 에서 미디어 파일을 안전하게 공유 앱에 다음 사항이 적용됩니다.

안전하게 공유하는 방법에 관한 자세한 내용은 파일 공유 정보를 참고하세요. 할 수 있습니다.

미디어 공유 최적화

앱에서 다른 사용자와 미디어를 공유하는지, 아니면 고품질 콘텐츠를 제공하는 미디어를 공유하려고 할 때 알게 되었습니다.

품질과 크기의 균형 맞추기

대용량 미디어 파일은 대역폭과 저장용량을 빠르게 사용하여 사용자에게 불편을 주는 지연 및 잠재적인 데이터 초과 요금에 대해 알아보겠습니다. 이 경우 압박이 가장 좋습니다.

  • 이미지 압축: 다음과 같이 최신 이미지 압축 형식을 활용합니다. 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()