Intent.ACTION_PROCESS_TEXT实现摘抄功能
Intent.ACTION_PROCESS_TEXT实现摘抄功能
- 一、实现效果
- 二、下载地址
- 三、使用方式
- 四、代码分析
- 五、参考资料
一、实现效果
Android6.0以上使用Intent.ACTION_PROCESS_TEXT
实现摘抄功能,理论上能摘抄10万字符。
TextView
实际测试达到理论值为10万字符;
浏览器(Chrome、系统浏览器)实际测试文本长度不超过1000个字符;
测试机型:坚果Pro2,Android7.1.1
二、下载地址
演示APK
ExtractActivity
演示项目工程
三、使用方式
- 在
AndroidManifest.xml
中添加Intent-Filter
<activity android:name=".ExtractActivity"android:label="摘抄"android:theme="@style/AppTheme.Transparent"><intent-filter><action android:name="android.intent.action.PROCESS_TEXT" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" /></intent-filter>
</activity>
- 获取数据
CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
另外,可以通过Intent.EXTRA_PROCESS_TEXT_READONLY
判断是否只读,非只读文本,可以通过setResult
返回处理后的文本。
四、代码分析
Editor
TextView
中通过Editor
创建了弹出菜单。
private void updateAssistMenuItems(Menu menu)private int createAssistMenuItemPendingIntentRequestCode()private boolean shouldEnableAssistMenuItems()private boolean onAssistMenuItemClicked(MenuItem assistMenuItem)
最终的选择文本
private boolean fireIntent(Intent intent) {if (intent != null && Intent.ACTION_PROCESS_TEXT.equals(intent.getAction())) {String selectedText = mTextView.getSelectedText();selectedText = TextUtils.trimToParcelableSize(selectedText);intent.putExtra(Intent.EXTRA_PROCESS_TEXT, selectedText);mEditor.mPreserveSelection = true;mTextView.startActivityForResult(intent, TextView.PROCESS_TEXT_REQUEST_CODE);return true;}return false;
}
理论上100K的字符数
private static final int PARCEL_SAFE_TEXT_LENGTH = 100000;@Nullable
public static <T extends CharSequence> T trimToParcelableSize(@Nullable T text) {return trimToSize(text, PARCEL_SAFE_TEXT_LENGTH);
}
AppCompatTextView
、AppCompatEditText
Editor
中创建的弹出菜单项,在AppCompatTextView
和AppCompatEditText
中被调整过,直接的结果是MenuItem
的groupId
从ID_ASSIST
变成MENU.NONE
。
public class AppCompatTextView extends TextView implements TintableBackgroundView,AutoSizeableTextView {@Overridepublic void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {super.setCustomSelectionActionModeCallback(TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));} }
public class AppCompatEditText extends EditText implements TintableBackgroundView {@Overridepublic void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {super.setCustomSelectionActionModeCallback(TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));}}
@RestrictTo(LIBRARY_GROUP)
@NonNull
public static ActionMode.Callback wrapCustomSelectionActionModeCallback(@NonNull final TextView textView,@NonNull final ActionMode.Callback callback) {if (Build.VERSION.SDK_INT < 26 || Build.VERSION.SDK_INT > 27|| callback instanceof OreoCallback) {// If the bug does not affect the current SDK version, or if// the callback was already wrapped, no need to wrap it.return callback;}// A bug in O and O_MR1 causes a number of options for handling the ACTION_PROCESS_TEXT// intent after selection to not be displayed in the menu, although they should be.// Here we fix this, by removing the menu items created by the framework code, and// adding them (and the missing ones) back correctly.return new OreoCallback(callback, textView);
}
// Populate the menu again with the ACTION_PROCESS_TEXT handlers.
final List<ResolveInfo> supportedActivities =getSupportedActivities(context, packageManager);
for (int i = 0; i < supportedActivities.size(); ++i) {final ResolveInfo info = supportedActivities.get(i);menu.add(Menu.NONE, Menu.NONE,MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i,info.loadLabel(packageManager)).setIntent(createProcessTextIntentForResolveInfo(info, mTextView)).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
五、参考资料
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0116/3877.html
Intent.ACTION_PROCESS_TEXT实现摘抄功能相关推荐
- Android Intent基本使用
Android Intent基本使用 Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供 ...
- 《Android 应用案例开发大全(第二版)》——6.1节Android系统的信使:Intent
本节书摘来自异步社区<Android 应用案例开发大全(第二版)>一书中的第6章,第6.1节Android系统的信使:Intent ,作者李宁,更多章节内容可以访问云栖社区"异步 ...
- Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义
公司培训了编码规范,回头过来看看我以前写过的代码,着实比较烂,缺少必要的注释,以及对于变量名的定义也不甚规范,故借着此次学习,我重新整理下一篇安卓项目的文章,规范下代码,可以用doxygen生成htm ...
- 高德地图--SDK集成--定位功能 地图定位搜索
最近项目需要到高德定图定位,就此记录下简单集成思路 下载文件之只放了libs和主要代码文件 https://download.csdn.net/download/qq_38355313/1035261 ...
- android加入聊天功能,app实现聊天功能 - houwanmin的个人空间 - OSCHINA - 中文开源技术交流社区...
. OpenIM(Android)主体功能集成 1.1 前置准备 如果您单纯是想体验OpenIM的功能,建议直接跳过这一步.直接查看快速集成. 在这个集成教程中,我们使用已创建的Demo应用,向您 ...
- Android学习笔记——APP页面转换与Intent学习
使用Intent保证多活动之间的切换,实现APP页面转换. 同时学习Intent其他诸多功能. 认知Intent Intent是Android程序中各组件之间进行交互的一种重要方式,不仅指明当前组件想 ...
- putextra 传递对象_intent.putextra用法 使用Intent传递对象的两种方式 - 电脑常识 - 服务器之家...
intent.putextra用法 使用Intent传递对象的两种方式 发布时间:2017-05-22 来源:服务器之家 Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动.发送广播. ...
- pAdPt_-9 活动的生命周期[LogCat java关键字] 传递数据[Intent 静态变量 全局变量 剪切板]
2015.11.13-11.17 平台. Windows 10 Android Studio 1.3.2 看"Android.老罗"的笔记以为Android开发入门的好瓜笔记,笔记 ...
- 书评 | 9 年码龄工程师读 Android 经典
作为一个码龄 9 年的 Android 开发工程师,因业界大前端趋势,从18 年开始更多的时间专注在 React Native 上,Android 相关新技术日渐生疏了.Kotlin 和 Jetpac ...
最新文章
- 程序员新手第一个python web开发框架
- laravel的composer require报错:Installation failed, reverting ./composer.json to its original content.
- BLE Mesh(1)—— 简述
- Freemarker循环遍历
- Linux Shell常用技巧(六)
- 2022年中国母婴新消费白皮书
- leetcode - 674. 最长连续递增序列
- 通过Cloudera Manager部署CDH5.15.1的webUI界面详解
- python魔法属性_python魔法方法-属性转换和类的表示详解
- 性能优化之无阻塞加载脚步方法比较
- ajaxForm和ajaxSubmit实现form的ajax提交的方法
- 中国AI公司会议室取名简史
- 2022年最新最全最牛的编程语言排名,让人大开眼界
- 国美易卡借助互联网,国美易卡搭建风控、运营、营销体系
- send 命令 linux,linux的send命令
- android java 指针异常处理,Android程序员日常开发中异常总结
- 中国电力集团公司旗下电厂分布
- 车载CarPlay盒子的蓝牙应用案例
- Python丨小学妹喜欢看漫画,于是我写了四十行代码获取了它所有漫画
- 记住下次看小电影前一定要检查域名是不是 HTTPS 的!