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);
}
  • AppCompatTextViewAppCompatEditText

Editor中创建的弹出菜单项,在AppCompatTextViewAppCompatEditText中被调整过,直接的结果是MenuItemgroupIdID_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实现摘抄功能相关推荐

  1. Android Intent基本使用

    Android Intent基本使用 Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供 ...

  2. 《Android 应用案例开发大全(第二版)》——6.1节Android系统的信使:Intent

    本节书摘来自异步社区<Android 应用案例开发大全(第二版)>一书中的第6章,第6.1节Android系统的信使:Intent ,作者李宁,更多章节内容可以访问云栖社区"异步 ...

  3. Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义

    公司培训了编码规范,回头过来看看我以前写过的代码,着实比较烂,缺少必要的注释,以及对于变量名的定义也不甚规范,故借着此次学习,我重新整理下一篇安卓项目的文章,规范下代码,可以用doxygen生成htm ...

  4. 高德地图--SDK集成--定位功能 地图定位搜索

    最近项目需要到高德定图定位,就此记录下简单集成思路 下载文件之只放了libs和主要代码文件 https://download.csdn.net/download/qq_38355313/1035261 ...

  5. android加入聊天功能,app实现聊天功能 - houwanmin的个人空间 - OSCHINA - 中文开源技术交流社区...

    .  OpenIM(Android)主体功能集成 1.1  前置准备 如果您单纯是想体验OpenIM的功能,建议直接跳过这一步.直接查看快速集成. 在这个集成教程中,我们使用已创建的Demo应用,向您 ...

  6. Android学习笔记——APP页面转换与Intent学习

    使用Intent保证多活动之间的切换,实现APP页面转换. 同时学习Intent其他诸多功能. 认知Intent Intent是Android程序中各组件之间进行交互的一种重要方式,不仅指明当前组件想 ...

  7. putextra 传递对象_intent.putextra用法 使用Intent传递对象的两种方式 - 电脑常识 - 服务器之家...

    intent.putextra用法 使用Intent传递对象的两种方式 发布时间:2017-05-22 来源:服务器之家 Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动.发送广播. ...

  8. pAdPt_-9 活动的生命周期[LogCat java关键字] 传递数据[Intent 静态变量 全局变量 剪切板]

    2015.11.13-11.17 平台. Windows 10 Android Studio 1.3.2 看"Android.老罗"的笔记以为Android开发入门的好瓜笔记,笔记 ...

  9. 书评 | 9 年码龄工程师读 Android 经典

    作为一个码龄 9 年的 Android 开发工程师,因业界大前端趋势,从18 年开始更多的时间专注在 React Native 上,Android 相关新技术日渐生疏了.Kotlin 和 Jetpac ...

最新文章

  1. 程序员新手第一个python web开发框架
  2. laravel的composer require报错:Installation failed, reverting ./composer.json to its original content.
  3. BLE Mesh(1)—— 简述
  4. Freemarker循环遍历
  5. Linux Shell常用技巧(六)
  6. 2022年中国母婴新消费白皮书
  7. leetcode - 674. 最长连续递增序列
  8. 通过Cloudera Manager部署CDH5.15.1的webUI界面详解
  9. python魔法属性_python魔法方法-属性转换和类的表示详解
  10. 性能优化之无阻塞加载脚步方法比较
  11. ajaxForm和ajaxSubmit实现form的ajax提交的方法
  12. 中国AI公司会议室取名简史
  13. 2022年最新最全最牛的编程语言排名,让人大开眼界
  14. 国美易卡借助互联网,国美易卡搭建风控、运营、营销体系
  15. send 命令 linux,linux的send命令
  16. android java 指针异常处理,Android程序员日常开发中异常总结
  17. 中国电力集团公司旗下电厂分布
  18. 车载CarPlay盒子的蓝牙应用案例
  19. Python丨小学妹喜欢看漫画,于是我写了四十行代码获取了它所有漫画
  20. 记住下次看小电影前一定要检查域名是不是 HTTPS 的!

热门文章

  1. Java类数组初始化
  2. 如何高速下载国外资源
  3. GitHub图片加载失败原因追究及解决方案
  4. OSS signature 计算
  5. 个人计算机的电子电路,PC机智能家电控制系统电路设计详解 —电路图天天读(88) - 全文...
  6. 堆和栈空间大小和作用
  7. 【Python】annotate函数
  8. 家政行业互联网+的趋势展望
  9. 如何设置Office2010直接打开.doc文件
  10. KTV服务员爆料内幕:果盘什么的千万别吃