android 插入gif,android – Gboard:在EditText上启用GIF插入

图像键盘支持

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.

这个怎么运作

Keyboard image insertion requires participation from both the IME and

the app. The following sequence describes each step in the image

insertion process:

When the user taps on an EditText, the editor sends a list of MIME

content types that it accepts in EditorInfo.contentMimeTypes.

The IME reads the list of supported types and displays content in the

soft keyboard that the editor can accept.

When the user selects an image, the IME calls commitContent() and

sends an InputContentInfo to the editor. The commitContent() call is

analogous to the commitText() call, but for rich content.

InputContentInfo contains an URI that identifies the content in a

content provider. Your app can then request permission and read the

content 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);

}

};

这是完整文档参考

为IME添加图像支持

IMEs that want to send rich content to apps must implement the

Commit Content API as shown below:

Override onStartInput() or onStartInputView() and read the list of

supported content types from the target editor. The following code

snippet shows how to check whether 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

}

}

Commit content to the app when the users selects an image. Avoid

calling commitContent() when there is any composing text because it

might cause the editor to lose focus. The following code snippet shows

how to commit 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);

}

这是完整文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值