热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Touchinput】图像键盘支持(20)

原用户经常想要与emojis,贴纸以及其他丰富内容进行交流。在以前的Android版本中,软键盘(也称为输入法编辑器或IME)

用户经常想要与emojis,贴纸以及其他丰富内容进行交流。在以前的Android版本中,软键盘(也称为 输入法编辑器或IME)只能将unicode表情符号发送到应用程序。对于丰富的内容,应用程序必须构建无法在其他应用程序中使用的特定于应用程序的API,或者使用通过Easy Share Action 或剪贴板发送图像的解决方法。

在Android 7.1(API等级25)中,Android SDK包含提交内容API,该API提供了一种通用方式,可让IME将图像和其他丰富内容直接发送到应用中的文本编辑器。自修订版25.0.0起,v13支持库中也提供该API。我们建议使用支持库,因为它早在Android 3.2(API Level 13)上运行于设备上,并且包含帮助程序方法以简化实施。

借助此API,您可以构建可接收来自任何键盘的丰富内容的通讯应用程序,以及可将丰富内容发送到任何应用程序的键盘。在 谷歌键盘 和应用程序,如 谷歌Messenger的 支持安卓7.1的提交内容API(见图1)。

本页面向您展示如何在IME和应用程序中实施提交内容API。
【Touch&input 】图像键盘支持(20)
图1.图像键盘支持的示例

怎么运行的


键盘图像插入需要IME和应用程序的参与。以下序列描述图像插入过程中的每个步骤:

当用户点击an时EditText,编辑器发送一个它接受的MIME内容类型列表EditorInfo.contentMimeTypes。

IME读取支持的类型列表,并在编辑器可以接受的软键盘上显示内容。

当用户选择图像时,IME会调用并发commitContent()送给 InputContentInfo 编辑器。该commitContent()呼叫与呼叫类似commitText(),但对于丰富的内容。InputContentInfo包含标识内容提供者中内容的URI 。然后,您的应用可以请求权限并从URI读取内容。
【Touch&input 】图像键盘支持(20)

为应用程序添加图像支持


要接受来自IME的丰富内容,应用程序必须告知IME它接受哪些内容类型,并指定在收到内容时执行的回调方法。以下示例演示如何创建一个EditText接受PNG图像的方法:

EditText editText = new EditText(this) {@Overridepublic InputConnection onCreateInputConnection(EditorInfo editorInfo) {final InputConnection ic = super.onCreateInputConnection(editorInfo);EditorInfoCompat.setContentMimeTypes(editorInfo,new String [] {"image/png"});final InputConnectionCompat.OnCommitContentListener callback =new InputConnectionCompat.OnCommitContentListener() {@Overridepublic boolean onCommitContent(InputContentInfoCompat inputContentInfo,int flags, Bundle opts) {// read and display inputContentInfo asynchronouslyif (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);}
};

有很多事情要做,所以让我们来解释一下发生了什么。

这个例子使用支持库,所以有一些引用来android.support.v13.view.inputmethod代替android.view.inputmethod。

这个例子创建一个EditText并覆盖其 onCreateInputConnection(EditorInfo)修改方法InputConnection。InputConnection是IME与正在接收其输入的应用程序之间的通信通道。

该调用super.onCreateInputConnection()保留了内置行为(发送和接收文本),并为您提供对InputConnection的引用。

setContentMimeTypes()将支持的MIME类型列表添加到EditorInfo。请务必在super.onCreateInputConnection()之前致电 setContentMimeTypes()。

callback在IME提交内容时执行。该方法 onCommitContent() 的引用 InputContentInfoCompat 包含内容URI。

如果您的应用在API Level 25或更高版本上运行,并且该INPUT_CONTENT_GRANT_READ_URI_PERMISSION 标志由IME设置,则应该请求并释放权限。否则,您应该已经可以访问内容URI,因为它是由IME授予的,或者因为内容提供者不限制访问权限。有关更多信息,请参阅将图像支持添加到IME。
createWrapper() 将inputConnection,修改后的editorInfo和回调包装成一个新的InputConnection并返回它。

以下是一些推荐的做法:

不支持丰富的内容不应调用编辑 setContentMimeTypes() 并离开自己的EditorInfo.contentMimeTypes 一套来null。

如果指定的MIME类型InputContentInfo 与它接受的任何类型不匹配,编辑应该忽略内容 。

丰富的内容不会影响文本光标的位置,也不会受其影响。处理内容时,编辑者可以忽略光标位置。

在编辑器的 OnCommitContentListener.onCommitContent() 方法中true,即使在加载内容之前,也可以异步返回。

与提交前可在IME中编辑的文本不同,丰富的内容会立即提交。请注意,如果您想为用户提供编辑或删除内容的能力,则必须自己实施逻辑。

要测试您的应用,请确保您的设备或模拟器具有能够发送丰富内容的键盘。您可以使用Android 7.1或更高版本的Google键盘,也可以安装CommitContent IME示例。

有关完整的代码示例,请参阅CommitContent App示例。

为IME添加图像支持


想要向应用发送丰富内容的IME必须实现Commit Content API,如下所示:
覆盖onStartInput()或onStartInputView()从目标编辑器读取支持的内容类型列表。以下代码片段显示了如何检查目标编辑器是否接受GIF图像。

@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}
}

当用户选择图像时向内容提交内容。避免commitContent() 在有任何撰写文本时调用 ,因为这可能会导致编辑器失去焦点。以下代码片段显示了如何提交GIF图像。

/*** 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);
}

作为IME作者,您很可能必须实现自己的内容提供者才能响应内容URI请求。例外情况是,如果您的IME支持来自现有内容提供商的内容MediaStore。有关构建内容提供者的信息,请参阅CommitContent IME示例, Content Provider文档和文件提供者 文档。

如果您正在构建自己的内容提供商,我们建议您不要导出它(设置 android:导出 到false)。相反,启用权限,通过设置在供应商给予 的android:grantUriPermission 来true。然后,当提交内容时,IME可以授予访问内容URI的权限。有两种方法可以做到这一点:

在Android 7.1(API Level 25)及更高版本上调用时commitContent(),请将flag参数设置为INPUT_CONTENT_GRANT_READ_URI_PERMISSION。然后,InputContentInfo 应用程序接收的对象可以通过调用requestPermission() 和请求并释放临时读取权限releasePermission()。

在Android 7.0(API级别24)及更低级别上,将INPUT_CONTENT_GRANT_READ_URI_PERMISSION 被忽略,因此您需要手动授予内容权限。一种方法是使用grantUriPermission(),但你可以实现你自己的机制来满足你自己的需求。

有关权限授予的示例,请参阅CommitContent IME示例中的doCommitContent()方法。

要测试IME,请确保您的设备或模拟器具有能够接收丰富内容的应用程序。您可以使用Android 7.1或更高版本中的Google Messenger应用程序,也可以安装 CommitContent Sample App。

有关完整的代码示例,请参阅CommitContent IME示例。

Lastest Update:2018.04.24

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Touch&input 】图像键盘支持(20)

转:https://blog.51cto.com/4789781/2125397



推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 本文介绍了如何在Android应用中通过Intent调用其他应用的Activity,并提供了详细的代码示例和注意事项。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 解决Pytesser模块在Windows环境下出现的错误
    本文详细探讨了如何解决在Windows环境中使用Pytesser模块进行OCR(光学字符识别)时遇到的WindowsError错误,提供了具体的解决方案。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • AngularJS 控制器详解
    本文通过一个示例详细介绍了 AngularJS 控制器的使用方法,并探讨了控制器之间数据共享的问题。 ... [详细]
  • 本文介绍了一种通过设置主题(Theme)来实现快速启动的Android引导页,并详细说明了如何避免因不同屏幕分辨率导致的图片拉伸问题。 ... [详细]
author-avatar
宅囧2502881733
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有