Gboard: enable GIF insertion in EditText

I use Google's Gboard in my application, and when I enter the GIF from the keyboard application into my EditText , it shows a toast

"The text box does not support pasting GIFs from the keyboard"

I have a search on this subject a thousand times and cannot find the result.

Any help would be appreciated.

+7
android android-edittext gboard
source share
2 answers

Graphic keyboard support

  Users often want to communicate with emojis, stickers, and other kinds of rich 
content. In previous versions of Android, soft keyboards (also known as input
method editors or IMEs) could send only unicode emoji to apps. For rich
content, apps had to either build app-specific APIs that couldn't be used in
other apps or use workaround like sending images through Easy Share Action or the
clipboard.

How it works

Inserting an image on the keyboard requires the participation of both the IME and the application. The following sequence describes each step of the image insertion process:

When the user clicks on EditText, the editor sends a list of MIME content types that it accepts in EditorInfo.contentMimeTypes.

The IME reads a list of supported types and displays the content that the editor can accept.

When the user selects an image, the IME calls commitContent () and sends the InputContentInfo editor to the editor. Calling commitContent () is similar to calling commitText (), but for rich content. InputContentInfo contains a URI that identifies the content in the service provider. Your application can then request permission and read the contents from the URI.

  To accept rich content from IMEs, apps must tell IMEs what content types it 
accepts and specify a callbackup method that is executed when content is
received. The following example demonstrates how to create an EditText that
accept PNG images:
 EditText editText = new EditText(this) { @Override public InputConnection onCreateInputConnection(EditorInfo editorInfo) { final InputConnection ic = super.onCreateInputConnection(editorInfo); EditorInfoCompat.setContentMimeTypes(editorInfo, new String [] {"image/png"}); final InputConnectionCompat.OnCommitContentListener callback = new InputConnectionCompat.OnCommitContentListener() { @Override public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) { // read and display inputContentInfo asynchronously if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { inputContentInfo.requestPermission(); } catch (Exception e) { return false; // return false if failed } } // read and display inputContentInfo asynchronously. // call inputContentInfo.releasePermission() as needed. return true; // return true if succeeded } }; return InputConnectionCompat.createWrapper(ic, editorInfo, callback); } }; 

Here is the complete documentation reference

https://developer.android.com/guide/topics/text/image-keyboard.html#how_it_works

Adding Image Support to IME

IMEs who want to send rich content to applications must implement the Commit Content API, as shown below:

Override onStartInput() or onStartInputView() and read the list of supported content types from the destination editor. The following snippet code shows how to check if the target editor accepts GIF images.

 @Override public void onStartInputView(EditorInfo info, boolean restarting) { String[] mimeTypes = EditorInfoCompat.getContentMimeTypes(editorInfo); boolean gifSupported = false; for (String mimeType : mimeTypes) { if (ClipDescription.compareMimeTypes(mimeType, "image/gif")) { gifSupported = true; } } if (gifSupported) { // the target editor supports GIFs. enable corresponding content } else { // the target editor does not support GIFs. disable corresponding content } } 

Freeze content for the app when users select an image. to avoid calling commitContent() when there is any text can cause the editor to lose focus. The following code snippet shows how to capture a GIF image.

 /** * Commits a GIF image * * @param contentUri Content URI of the GIF image to be sent * @param imageDescription Description of the GIF image to be sent */ public static void commitGifImage(Uri contentUri, String imageDescription) { InputContentInfoCompat inputContentInfo = new InputContentInfoCompat( contentUri, new ClipDescription(imageDescription, new String[]{"image/gif"})); InputConnection inputConnection = getCurrentInputConnection(); EditorInfo editorInfo = getCurrentInputEditorInfo(); Int flags = 0; if (android.os.Build.VERSION.SDK_INT >= 25) { flags |= InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION; } InputConnectionCompat.commitContent( inputConnection, editorInfo, inputContentInfo, flags, opts); } 

Here is the complete documentation

https://developer.android.com/guide/topics/text/image-keyboard.html#adding_image_support_to_imes

+7
source share

I found a solution below from somewhere. Hope this helps everyone for sure.

 import android.content.Context; import android.os.Bundle; import android.support.v13.view.inputmethod.EditorInfoCompat; import android.support.v13.view.inputmethod.InputConnectionCompat; import android.support.v13.view.inputmethod.InputContentInfoCompat; import android.support.v4.os.BuildCompat; import android.util.AttributeSet; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; public class MyEditText extends android.support.v7.widget.AppCompatEditText { private String[] imgTypeString; private KeyBoardInputCallbackListener keyBoardInputCallbackListener; public MyEditText(Context context) { super(context); initView(); } public MyEditText(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { imgTypeString = new String[]{"image/png", "image/gif", "image/jpeg", "image/webp"}; } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { final InputConnection ic = super.onCreateInputConnection(outAttrs); EditorInfoCompat.setContentMimeTypes(outAttrs, imgTypeString); return InputConnectionCompat.createWrapper(ic, outAttrs, callback); } final InputConnectionCompat.OnCommitContentListener callback = new InputConnectionCompat.OnCommitContentListener() { @Override public boolean onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts) { // read and display inputContentInfo asynchronously if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { inputContentInfo.requestPermission(); } catch (Exception e) { return false; // return false if failed } } boolean supported = false; for (final String mimeType : imgTypeString) { if (inputContentInfo.getDescription().hasMimeType(mimeType)) { supported = true; break; } } if (!supported) { return false; } if (keyBoardInputCallbackListener != null) { keyBoardInputCallbackListener.onCommitContent(inputContentInfo, flags, opts); } return true; // return true if succeeded } }; public interface KeyBoardInputCallbackListener { void onCommitContent(InputContentInfoCompat inputContentInfo, int flags, Bundle opts); } public void setKeyBoardInputCallbackListener(KeyBoardInputCallbackListener keyBoardInputCallbackListener) { this.keyBoardInputCallbackListener = keyBoardInputCallbackListener; } public String[] getImgTypeString() { return imgTypeString; } public void setImgTypeString(String[] imgTypeString) { this.imgTypeString = imgTypeString; } } 
0
source share

All Articles