최신 그림 이모티콘 지원

Compose 사용해 보기
Jetpack Compose는 Android를 위한 권장 UI 도구 키트입니다. Compose에서 그림 이모티콘을 지원하는 방법을 알아보세요.

모든 유형의 앱에서 그림 이모티콘 사용이 급속히 늘어나면서 표준 세트의 그림 이모티콘이 매년 유니코드로 새롭게 태어나고 있습니다.

앱에서 인터넷 콘텐츠를 표시하거나 텍스트 입력을 제공하는 경우 최신 그림 이모티콘 글꼴을 지원하는 것이 좋습니다. 그러지 않으면 이후 그림 이모티콘이 두부 (☐)라는 작은 정사각형 상자나 잘못 렌더링된 다른 그림 이모티콘 시퀀스로 표시될 수 있습니다.

Android 버전 11 (API 수준 30) 이하에서는 그림 이모티콘 글꼴을 업데이트할 수 없으므로 이러한 버전에서 그림 이모티콘을 표시하는 앱은 수동으로 업데이트해야 합니다.

다음은 최신 그림 이모티콘의 예입니다.

버전
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0(2021년 9월)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1(2020년 9월)
🥲 🥷🏿 🐻‍❄️ 13.0(2020년 3월)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1(2019년 10월)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0(2019년 2월)

androidx.emoji2:emoji2 라이브러리는 더 간단한 방식으로 이전 Android 버전과의 하위 호환성을 제공합니다. emoji2 라이브러리는 AppCompat 라이브러리의 종속 항목이며 작동하는 데 추가 구성이 필요하지 않습니다.

Compose의 그림 이모티콘 지원

2023년 3월 BOM (Compose UI 1.4)에서는 API 21까지의 이전 Android 버전과의 하위 호환성을 비롯하여 최신 그림 이모티콘 버전을 지원합니다. 이 페이지에서는 뷰 시스템에서 최신 그림 이모티콘을 구성하는 방법을 설명합니다. 자세한 내용은 Compose의 이모티콘 페이지를 참고하세요.

기본 요건

앱이 최신 그림 이모티콘을 제대로 표시하는지 확인하려면 Android 10 (API 수준 29) 이하를 실행하는 기기에서 앱을 실행합니다. 이 페이지에는 테스트 용도로 표시할 수 있는 최신 그림 이모티콘이 포함되어 있습니다.

AppCompat를 사용하여 최신 그림 이모티콘 지원

AppCompat 1.4에는 그림 이모티콘 지원이 포함되어 있습니다.

AppCompat를 사용하여 그림 이모티콘을 지원하려면 다음 단계를 따르세요.

  1. 모듈이 AppCompat 라이브러리 버전 1.4.0-alpha01 이상에 종속되는지 확인합니다.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. 텍스트를 표시하는 모든 활동이 AppCompatActivity 클래스를 확장하는지 확인합니다.

    Kotlin

    MyActivity.kt
    
    class MyActivity: AppCompatActivity {
    ...
    }

    자바

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
  3. Android 10 이하를 실행하는 기기에서 앱을 실행하고 다음 테스트 문자열을 표시하여 통합을 테스트합니다. 모든 문자가 올바르게 렌더링되는지 확인합니다.

    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

앱은 emoji2와 호환되는 다운로드 가능한 글꼴 제공자를 제공하는 모든 기기(예: Google Play 서비스에서 제공하는 기기)에서 이전 버전과 호환되는 그림 이모티콘을 자동으로 표시합니다.

앱에서 AppCompat를 사용하지만 두부(☐)를 표시하는 경우

경우에 따라 AppCompat 라이브러리를 추가해도 앱에 적절한 그림 이모티콘 대신 두부가 표시될 수 있습니다. 다음은 몇 가지 가능한 설명 및 해결책입니다.

최근에 플래시된 기기 또는 새 에뮬레이터에서 앱을 실행 중임

앱의 Google Play 서비스 데이터를 삭제하여 시작 중에 발생할 수 있는 글꼴 캐싱을 지웁니다. 이렇게 하면 일반적으로 몇 시간 후에 문제가 해결됩니다.

앱 데이터를 삭제하려면 다음 단계를 따르세요.

  1. Android 기기에서 설정을 엽니다.

  2. 앱 및 알림을 탭합니다.

  3. 모든 앱 보기 또는 앱 정보를 탭합니다.

  4. 앱을 스크롤하여 Google Play 서비스를 탭합니다.

  5. 저장용량 및 캐시를 탭합니다.

  6. 캐시 지우기를 탭합니다.

앱에서 AppCompat 텍스트 관련 클래스를 사용하지 않음

AppCompatActivity를 확장하지 않거나 코드에서 TextView 같은 뷰를 인스턴스화하는 경우에 이 현상이 발생할 수 있습니다. 다음 사항을 확인하세요.

  • 활동이 AppCompatActivity를 확장합니다.
  • 코드에서 뷰를 만드는 경우 올바른 AppCompat 서브클래스를 사용합니다.

AppCompatActivity는 XML을 확장할 때 TextView 대신 AppCompatTextView를 자동으로 확장하므로 XML을 업데이트할 필요가 없습니다.

테스트 전화에서 다운로드 가능한 글꼴을 지원하지 않음

DefaultEmojiCompatConfig.create가 null이 아닌 구성을 반환하는지 확인합니다.

이전 API 수준의 에뮬레이터가 Google Play 서비스를 업그레이드하지 않음

이전 API 수준의 에뮬레이터를 사용하는 경우 글꼴 제공자를 찾으려면 emoji2와 관련해 번들된 Google Play 서비스를 업데이트해야 할 수 있습니다. 이렇게 하려면 에뮬레이터에서 Google Play 스토어에 로그인합니다.

호환되는 버전이 설치되어 있는지 확인하려면 다음 단계를 따르세요.

  1. 다음 명령어를 실행합니다.

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. versionCode211200000보다 높은지 확인합니다.

AppCompat 없이 그림 이모티콘 지원

앱에 AppCompat를 포함할 수 없는 경우 emoji2를 직접 사용할 수 있습니다. 이렇게 하려면 더 많은 작업이 필요하므로 앱에서 AppCompat를 사용할 수 없는 경우에만 이 방법을 사용합니다.

AppCompat 라이브러리 없이 그림 이모티콘을 지원하려면 다음을 실행합니다.

  1. 앱의 build.gradle 파일에 emoji2emoji2-views를 포함합니다.

    build.gradle
    
    def emojiVersion = "1.0.0-alpha03"
    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-views:$emojiVersion"
    

    emoji2-views 모듈은 EmojiCompat를 구현하는 TextView, Button, EditText서브클래스를 제공합니다. AppCompat를 포함하는 앱에서는 사용하지 마세요. 이미 EmojiCompat를 구현하고 있기 때문입니다.

  2. XML 및 코드에서 TextView, EditText 또는 Button를 사용할 때마다 EmojiTextView, EmojiEditText 또는 EmojiButton을 대신 사용합니다.

    activity_main.xml
    
    <androidx.emoji2.widget.EmojiTextView ... />
    <androidx.emoji2.widget.EmojiEditText ... />
    <androidx.emoji2.widget.EmojiButton ... />
    

    emoji2 모듈을 포함하면 시스템에서는 다운로드 가능한 기본 글꼴 제공자를 사용하여 앱 시작 직후 그림 이모티콘 글꼴을 자동으로 로드합니다. 추가 구성이 필요하지 않습니다.

  3. 통합을 테스트하려면 Android 11 이하를 실행하고 다음 테스트 문자열을 표시하는 기기에서 앱을 실행합니다. 모든 문자가 올바르게 렌더링되는지 확인합니다.

    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

위젯 없이 EmojiCompat 사용

EmojiCompatEmojiSpan를 사용하여 올바른 이미지를 렌더링합니다. 따라서 지정된 CharSequence 객체를 EmojiSpan 객체가 있는 Spanned 객체로 변환해야 합니다. EmojiCompat 클래스는 CharSequencesSpanned 인스턴스로 변환하는 process() 메서드를 제공합니다. 이 메서드를 사용하면 백그라운드에서 process()를 호출하고 결과를 캐시할 수 있으므로 앱 성능이 향상됩니다.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

자바

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

입력 방식 편집기(IME)에 EmojiCompat 사용

EmojiCompat 클래스를 사용하면 키보드가 상호작용하는 앱에서 지원되는 그림 이모티콘을 렌더링할 수 있습니다. 입력 방식 편집기(IME)getEmojiMatch() 메서드를 사용하여 EmojiCompat의 인스턴스가 그림 이모티콘을 렌더링할 수 있는지 확인할 수 있습니다. 이 메서드는 그림 이모티콘의 CharSequence를 사용하며 EmojiCompat가 그림 이모티콘을 감지하고 렌더링할 수 있다면 true를 반환합니다.

또한 키보드는 앱에서 지원하는 EmojiCompat 버전을 확인하여 팔레트에서 렌더링할 그림 이모티콘을 결정할 수도 있습니다. 사용 가능한 버전이 있어 버전을 확인하기 위해 키보드는 EditorInfo.extras 번들에 다음 키가 있는지 확인할 수 있습니다.

  • EDITOR_INFO_METAVERSION_KEY: 앱에서 사용하는 그림 이모티콘 메타데이터의 버전을 나타냅니다. 이 키가 없으면 앱은 EmojiCompat를 사용하지 않는 것입니다.
  • EDITOR_INFO_REPLACE_ALL_KEY: 키가 존재하고 true로 설정되어 있으면 앱은 그림 이모티콘이 시스템에 있더라도 모든 그림 이모티콘을 대체하도록 EmojiCompat를 구성합니다.

EmojiCompat 인스턴스를 구성하는 방법을 자세히 알아보세요.

맞춤 뷰에서 그림 이모티콘 사용

앱에 TextView의 직접 또는 간접 서브클래스(예: Button, Switch 또는 EditText)에 해당하는 맞춤 뷰가 있고 이러한 뷰가 사용자 제작 콘텐츠를 표시할 수 있는 경우 뷰는 각각 EmojiCompat를 구현해야 합니다.

프로세스는 앱에서 AppCompat 라이브러리를 사용하는지에 따라 다릅니다.

AppCompat를 사용하는 앱에 맞춤 뷰 추가

앱에서 AppCompat를 사용하는 경우 플랫폼 구현 대신 AppCompat 구현을 확장합니다. AppCompat에서 뷰를 확장하는 방법과 관련해서는 다음 표를 가이드로 사용하세요.

다음을 확장하는 대신 다음을 확장
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

AppCompat를 사용하지 않는 앱에 맞춤 뷰 추가

앱에서 AppCompat를 사용하지 않는다면 맞춤 뷰에 사용하도록 설계된 뷰 통합 도우미를 emoji2-views-helper 모듈에 사용합니다. AppCompat 라이브러리가 그림 이모티콘 지원을 구현하는 데 사용하는 도우미입니다.

AppCompat를 사용하지 않는 앱에 맞춤 뷰를 지원하려면 다음 단계를 완료합니다.

  1. emoji2-views-helper 라이브러리를 추가합니다.

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. 안내에 따라 앱의 맞춤 뷰에 EmojiTextViewHelper 또는 EmojiEditTextHelper를 포함합니다.

  3. Android 10 이하를 실행하는 기기에서 앱을 실행하고 다음 테스트 문자열을 표시하여 통합을 테스트합니다. 모든 문자가 올바르게 렌더링되는지 확인합니다.

    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

emoji2 처리를 위한 선택적 기능

앱에 emoji2 라이브러리를 포함했으면 이 섹션에 설명된 선택적 기능을 추가할 수 있습니다.

다른 글꼴 또는 다운로드 가능한 글꼴 제공자를 사용하도록 emoji2 구성

다른 글꼴 또는 다운로드 가능한 글꼴 제공자를 사용하도록 emoji2를 구성하려면 다음을 진행합니다.

  1. 다음을 매니페스트에 추가하여 EmojiCompatInitializer를 중지합니다.

    <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer"
               tools:node="remove" />
    </provider>
  2. 다음 중 한 가지 방법을 사용합니다.

    • DefaultEmojiCompatConfiguration.create(context)를 호출하여 기본 구성을 사용합니다.

    • EmojiCompat.Config를 사용하여 다른 소스에서 글꼴을 로드하는 자체 구성을 만듭니다. 이 클래스는 다음 섹션에 설명된 대로 EmojiCompat 동작을 수정하는 몇 가지 옵션을 제공합니다.

EmojiCompat 동작 수정

EmojiCompat.Config의 인스턴스를 사용하여 EmojiCompat 동작을 수정할 수 있습니다.

가장 중요한 구성 옵션은 setMetadataLoadStrategy()입니다. 이 옵션은 EmojiCompat가 글꼴을 로드하는 시기를 제어합니다. EmojiCompat.load()가 호출되는 즉시 글꼴 로드가 시작되고 그러면 필요한 다운로드가 트리거됩니다. 앱에서 제공하지 않는 한, 시스템에서 글꼴 다운로드를 위한 스레드를 생성합니다.

LOAD_STRATEGY_MANUAL를 사용하면 EmojiCompat.load()의 호출 시점을 제어할 수 있고, LOAD_STRATEGY_DEFAULT를 사용하면 EmojiCompat.init() 호출 시 로드가 동기식으로 시작됩니다.

대부분의 앱은 LOAD_STRATEGY_MANUAL을 사용하여 글꼴 로드의 스레드와 시기를 제어합니다. 앱은 시작 지연 시간이 발생하지 않도록 첫 번째 화면이 표시될 때까지 지연해야 합니다. EmojiCompatInitializer는 이 방식을 따르고, 첫 번째 화면이 다시 시작할 때까지 그림 이모티콘 글꼴 로드를 지연합니다.

기본 클래스의 다음 메서드를 사용하여 구성의 다른 측면을 설정합니다.

  • setReplaceAll(): EmojiCompat가 검색한 모든 그림 이모티콘을 EmojiSpan의 인스턴스로 대체하는지 결정합니다. 기본적으로 EmojiCompat는 시스템에서 그림 이모티콘을 렌더링할 수 있다고 추론할 경우 그 그림 이모티콘을 대체하지 않습니다. true로 설정하면 EmojiCompat은 모든 그림 이모티콘을 EmojiSpan 객체로 대체합니다.
  • setEmojiSpanIndicatorEnabled(): EmojiCompat가 그림 이모티콘을 EmojiSpan 객체로 대체하는지 나타냅니다. true로 설정하면 EmojiCompatEmojiSpan의 배경을 그립니다. 이 메서드는 주로 디버깅 목적으로 사용됩니다.
  • setEmojiSpanIndicatorColor: EmojiSpan을 나타내는 색상을 설정합니다. 기본값은 GREEN입니다.
  • registerInitCallback(): EmojiCompat 초기화 상태에 관해 앱에 알립니다.

초기화 리스너 추가

EmojiCompatEmojiCompat.Config 클래스는 초기화 콜백을 등록하거나 등록 취소할 수 있는 registerInitCallback()unregisterInitCallback() 메서드를 제공합니다. 앱은 이러한 콜백을 사용하여 EmojiCompat가 초기화될 때까지 기다린 후 백그라운드 스레드 또는 맞춤 뷰에서 그림 이모티콘을 처리합니다.

이러한 메서드를 사용하려면 EmojiCompat.InitCallback 클래스의 인스턴스를 생성해야 합니다. 이러한 메서드를 호출하고 EmojiCompat.InitCallback 클래스의 인스턴스를 전달합니다. 초기화에 성공하면 EmojiCompat 클래스가 onInitialized() 메서드를 호출합니다. 라이브러리가 초기화되지 않으면 EmojiCompat 클래스는 onFailed() 메서드를 호출합니다.

언제든지 초기화 상태를 확인하려면 getLoadState() 메서드를 호출합니다. 이 메서드는 LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, LOAD_STATE_FAILED 값 중 하나를 반환합니다.

emoji2로 번들된 글꼴 지원

emoji2-bundled 아티팩트를 사용하여 앱에 그림 이모티콘 글꼴을 번들로 묶을 수 있습니다. 하지만 NotoColorEmoji 글꼴이 10MB를 초과하므로 가능하면 앱에서 다운로드 가능한 글꼴을 사용하는 것이 좋습니다. emoji2-bundled 아티팩트는 다운로드 가능한 글꼴을 지원하지 않는 기기의 앱에 사용하기 위한 용도입니다.

emoji2-bundled 아티팩트를 사용하려면 다음을 진행합니다.

  1. emoji2-bundledemoji2 아티팩트를 포함합니다.

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. 번들된 구성을 사용하도록 emoji2를 구성합니다.

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))

    자바

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
  3. AppCompatemojicompat과 함께 또는 이 항목 없이 포함한 다음 위 단계에 따라 통합을 테스트합니다. 테스트 문자열이 올바르게 표시되는지 확인합니다.

    • 14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • 13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • 13.0: 🥲, 🥷🏿, 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

자동 EmojiCompat 구성의 영향

시작 라이브러리, EmojiCompatInitializer, DefaultEmojiCompatConfig를 사용하여 기본 구성이 적용됩니다.

앱에서 첫 번째 활동이 다시 시작되면 이니셜라이저가 그림 이모티콘 글꼴 로드를 예약합니다. 지연이 짧기 때문에, 백그라운드 스레드에서의 글꼴 로드로 인한 잠재적 지연 시간 없이 앱은 초기 콘텐츠를 표시할 수 있습니다.

DefaultEmojiCompatConfigEmojiCompat 인터페이스를 구현하는 다운로드 가능한 시스템 설치 글꼴 제공자(예: Google Play 서비스)를 찾습니다. 그러면 Google Play 서비스에서 제공하는 기기에서는 Google Play 서비스를 사용하여 글꼴이 로드됩니다.

이니셜라이저가 그림 이모티콘 글꼴을 로드하기 위한 백그라운드 스레드를 만듭니다. 글꼴 다운로드는 시간 초과 전까지 최대 10초가 걸릴 수 있습니다. 글꼴을 다운로드한 후 백그라운드 스레드에서 EmojiCompat를 초기화하는 데 약 150밀리초가 걸립니다.

EmojiCompatInitializer를 중지하는 경우라도 EmojiCompat의 초기화를 지연합니다. EmojiCompat를 수동으로 구성하는 경우, 첫 번째 화면 로드와의 백그라운드 경합을 방지하기 위해 앱의 첫 번째 화면이 표시되면 EmojiCompat.load()를 호출합니다.

로드되면 EmojiCompat는 그림 이모티콘 메타데이터를 보관하는 데 약 300KB의 RAM을 사용합니다.