Problem

Android 7.1(API 레벨 25) 이상에서는 안드로이드 키보드에 이미지 및 리치 콘텐츠를 제공하고 있다. 채팅 애플리케이션 등에서 안드로이드 키보드에서 지원하는 gif 등의 이미지를 선택하는 경우 바로 전송할 수 있어야 한다. 또는 앱이 지원하지 않는 경우 지원하지 않는 기능이라고 표시해주면 더 좋겠다. 하지만 앱의 별도 구현이 없는 경우 해당 기능이 동작하지 않거나 앱이 해당 이미지 공유를 지원한다면 대화 형식으로 바로 전송할 수 있는 상황이라도 공유 화면으로 전환 될 수 있다.

Solution

gif 이미지 전송을 위해 AppCompatEditText을 상속받은 별도의 EditText를 만들고 onCreateInputConnection를 구현했다. 1

override fun onCreateInputConnection(editorInfo: EditorInfo?): InputConnection {
    if(editorInfo != null) {
        val ic: InputConnection = super.onCreateInputConnection(editorInfo)
        EditorInfoCompat.setContentMimeTypes(editorInfo, arrayOf("image/gif"))

        val callback =
                InputConnectionCompat.OnCommitContentListener { inputContentInfo, flags, opts ->
                    val lacksPermission = (flags and
                            InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0
                    // read and display inputContentInfo asynchronously
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 && lacksPermission) {
                        try {
                            inputContentInfo.requestPermission()
                        } catch (e: Exception) {
                            return@OnCommitContentListener false // return false if failed
                        }
                    }

                    // sendImage(inputContentInfo.contentUri)

                    true  // return true if succeeded
                }

        return InputConnectionCompat.createWrapper(ic, editorInfo, callback)
    }else {
        return super.onCreateInputConnection(editorInfo)
    }
}

References