리치 콘텐츠 받기

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
그림 1. 통합 API는 API를 통해 특정 UI 메커니즘과 관계없이 수신되는 콘텐츠(예: 터치 & 드래그 앤 드롭을 사용할 수도 있습니다.

사용자는 이미지, 동영상, 기타 생생한 콘텐츠를 좋아하지만 앱에서 이 콘텐츠를 옮기는 것이 항상 쉽지만은 않습니다. 앱이 더 간편하게 Android 12 (API 수준 31)에는 앱이 클립보드나 키보드, 드래그 등 모든 소스의 콘텐츠를 허용할 수 있습니다.

다음과 같은 인터페이스를 연결할 수 있습니다. OnReceiveContentListener님, 콘텐츠가 삽입될 때 콜백을 받을 수 있습니다. 메커니즘입니다. 콜백은 일반 텍스트와 스타일이 지정된 텍스트부터 마크업, 이미지, 동영상, 오디오 파일 등에 이르기까지 코드에서 모든 콘텐츠 수신을 처리하는 단일 장소가 됩니다.

이전 Android 버전과의 호환성을 위해 이 API는 AndroidX에서 사용할 수 있으며 Core 1.7Appcompat 1.4 이 기능을 구현할 때 사용하시기 바랍니다.

개요

다른 기존 API에서 각 UI 메커니즘(예: 터치 및 메뉴 길게 누르기 '드래그'라는 자체 API가 있습니다. 즉, 각 API와 별도로 통합하여 콘텐츠를 삽입하는 각 메커니즘에 유사한 코드를 추가해야 합니다.

구현할 다양한 작업과 관련 API를 보여주는 이미지
그림 2. 이전에는 앱에서 각 UI마다 다른 API를 구현함 메커니즘을 제공합니다.

OnReceiveContentListener API는 구현할 단일 API를 만들어 이러한 다양한 코드 경로를 통합하므로 개발자는 앱별 로직에 집중하고 나머지는 플랫폼에서 처리하도록 할 수 있습니다.

간소화된 통합 API를 보여주는 이미지
그림 3. 통합 API를 사용하면 모든 UI 메커니즘을 지원하는 API입니다.

이 접근 방식은 또한 새로운 콘텐츠 삽입 방법이 지원을 사용 설정하기 위해 추가로 코드를 변경할 필요가 없습니다. 확인할 수 있습니다. 앱이 특정 광고 소재에 대한 전체 맞춤설정을 구현해야 하는 경우 여전히 기존 API를 사용할 수 있으며, 이러한 API는 사용할 수 있습니다.

구현

API는 단일 메서드 OnReceiveContentListener가 있는 리스너 인터페이스입니다. 이전 버전의 Android 플랫폼을 지원하려면 AndroidX Core 라이브러리에서 일치하는 OnReceiveContentListener 인터페이스를 사용하는 것이 좋습니다.

API를 사용하려면 사용할 콘텐츠 유형을 지정하여 리스너를 구현합니다. 앱에서 처리할 수 있는 예:

Kotlin

object MyReceiver : OnReceiveContentListener {
    val MIME_TYPES = arrayOf("image/*", "video/*")
    
    // ...
    
    override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? {
        TODO("Not yet implemented")
    }
}

자바

public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
     // ...
}

앱에서 지원하는 콘텐츠 MIME 유형을 모두 지정한 후 나머지 리스너를 구현합니다.

Kotlin

class MyReceiver : OnReceiveContentListener {
    override fun onReceiveContent(view: View, contentInfo: ContentInfoCompat): ContentInfoCompat {
        val split = contentInfo.partition { item: ClipData.Item -> item.uri != null }
        val uriContent = split.first
        val remaining = split.second
        if (uriContent != null) {
            // App-specific logic to handle the URI(s) in uriContent.
        }
        // Return anything that your app didn't handle. This preserves the
        // default platform behavior for text and anything else that you aren't
        // implementing custom handling for.
        return remaining
    }

    companion object {
        val MIME_TYPES = arrayOf("image/*", "video/*")
    }
}

자바

 public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};

     @Override
     public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) {
         Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition(
                 item -> item.getUri() != null);
         ContentInfo uriContent = split.first;
         ContentInfo remaining = split.second;
         if (uriContent != null) {
             // App-specific logic to handle the URI(s) in uriContent.
         }
         // Return anything that your app didn't handle. This preserves the
         // default platform behavior for text and anything else that you aren't
         // implementing custom handling for.
         return remaining;
     }
 }

앱이 이미 인텐트 공유를 지원하면 콘텐츠 URI 처리를 위한 앱별 로직 남아 있는 데이터를 반환하여 이 데이터의 처리를 플랫폼에 위임합니다.

리스너를 구현한 후에는 앱:

Kotlin

class MyActivity : Activity() {
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        val myInput = findViewById(R.id.my_input)
        ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, MyReceiver())
    }
}

자바

public class MyActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // ...

         AppCompatEditText myInput = findViewById(R.id.my_input);
         ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, new MyReceiver());
     }
}

URI 권한

읽기 권한은 플랫폼에서 자동으로 콘텐츠 URI를 페이로드를 OnReceiveContentListener로 전달합니다.

일반적으로 앱은 서비스나 활동에서 콘텐츠 URI를 처리합니다. 대상 사용하여 WorkManager: Cloud Build를 구현할 때 이를 위해서는 콘텐츠를 사용하여 Intent.setClipData 드림 플래그 설정하기 FLAG_GRANT_READ_URI_PERMISSION

또는 현재 컨텍스트 내에서 백그라운드 스레드를 사용하여 콘텐츠를 처리합니다. 이 경우 권한이 부여되지 않도록 리스너에서 payload 객체를 수신했습니다. 할 수 있습니다.

맞춤 보기

앱에서 맞춤 View 서브클래스를 사용하는 경우 OnReceiveContentListener이(가) 우회되지 않았습니다.

View 클래스가 onCreateInputConnection 메서드를 사용하려면 Jetpack API를 사용하세요. InputConnectionCompat.createWrapper InputConnection를 구성합니다.

View 클래스가 onTextContextMenuItem 메서드, 메뉴 항목이 선택될 때 super에 위임합니다. R.id.paste 또는 R.id.pasteAsPlainText

키보드 이미지 API와 비교

OnReceiveContentListener API는 기존 키보드 이미지 API의 다음 버전으로 생각할 수 있습니다. 이 통합 API는 키보드 이미지 API의 기능과 일부 추가 기능을 지원합니다. 기기 및 기능 호환성은 Jetpack 라이브러리를 사용하는지 Android SDK의 네이티브 API를 사용하는지에 따라 다릅니다.

표 1. 지원되는 기능 및 API 수준 Jetpack을 살펴보겠습니다.
작업 또는 기능 키보드 이미지 API에서 지원 통합 API에서 지원
키보드에서 삽입 예(API 수준 13 이상) 예(API 수준 13 이상)
터치하여 붙여넣기 및 메뉴 길게 누르기 아니요
드래그 앤 드롭을 사용하여 삽입 아니요 예(API 수준 24 이상)
표 2. 네이티브에 지원되는 기능 및 API 수준 제공합니다.
작업 또는 기능 키보드 이미지 API에서 지원 통합 API에서 지원
키보드에서 삽입 예(API 수준 25 이상) 예(Android 12 이상)
터치하여 붙여넣기 및 메뉴 길게 누르기 아니요
드래그 앤 드롭을 사용하여 삽입 아니요