在另一个应用程序中捕获文本选择

Posted

技术标签:

【中文标题】在另一个应用程序中捕获文本选择【英文标题】:Catching text selection in another application 【发布时间】:2015-05-03 17:32:31 【问题描述】:

我想使用 android 制作一个小部件,我需要捕获任何文本选择事件。例如一个用户正在阅读某事。并在另一个应用程序(网络浏览器、pdf 阅读器、消息传递)中选择文本。

是否可以在后台捕获任何文本选择?

【问题讨论】:

使用剪贴板是最好的方法,这里是Example @kyur 你有没有发现任何方法可以在任何其他应用程序中检测 andorid 中的文本选择?我的意思是文本选择而不是文本复制。 我也想要这个。不复制,只选择。这可能吗? @Mr.Newman MahendraChhimwal 你找到什么方法了吗 对于一些文章,我的意思是您只能在自己的应用程序中执行此操作(对上下文菜单进行一些修改),但在另一个应用程序中,为了安全起见,您不能这样做(一个应用程序对抗另一个应用程序) .因此,只有当文本被复制(到剪贴板)时,所有应用程序才能读取它。但不是选择 【参考方案1】:

试试这个从剪贴板获取文本

     ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     clipboard.getText();

Set text and get text from clipboard

【讨论】:

【参考方案2】:

示例代码:

String textToPaste = null;

ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);

/* Returns true if there is currently a primary clip on the clipboard. */

if (clipboard.hasPrimaryClip()) 
    ClipData clip = clipboard.getPrimaryClip();

    // if you need text data only, then you have to check the MIME type for Text as i shown below :
    if (clip.getDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))
        // WARNING: The item could cantain URI that points to the text data.
        // In this case the getText() returns null and this code fails!
        textToPaste = clip.getItemAt(0).getText().toString();

    // or you may coerce the data to the text representation: i have explained this in the second image.
    textToPaste = clip.getItemAt(0).coerceToText(this).toString();


if (!TextUtils.isEmpty(textToPaste))
     ((TextView)findViewById(R.id.etInput1)).setText(textToPaste);

更多信息,请查看官方链接

http://developer.android.com/reference/android/content/ClipData.html

http://developer.android.com/reference/android/content/ClipboardManager.html

【讨论】:

如何只捕捉选择?不复制【参考方案3】:

1.你可以定义一个服务在后台监听剪贴板事件

 ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    clipboardManager.setPrimaryClip(new ClipboardManager.OnPrimaryClipChangedListener()
        @Override
        public void onPrimaryClipChanged() 
            //TODO do your work

        
    );

2.或者您可以使用 AccessibilityService 检测复制文本事件,监听“TYPE_VIEW_TEXT_SELECTION_CHANGED”事件并从剪贴板读取数据,但您应该引导用户在系统设置中为您的应用启用辅助功能开关。

【讨论】:

以上是关于在另一个应用程序中捕获文本选择的主要内容,如果未能解决你的问题,请参考以下文章

在另一个程序中访问选定的文本[重复]

在 Google Docs 中捕获文本选择

Windows Phone 8 文本选择选项

从文本字段捕获数据时如何忽略自动完成值?

如何在 iPad 应用程序中取消选择选定的文本

正则表达式匹配零和逗号