AccessibilityService 获取选中的文本
AccessibilityService get selected text
我正在创建需要在其他应用程序中获取 selected 文本的 AccesibilityService。
我的 xml 服务资源如下所示:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewTextSelectionChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"/>
和java代码
@Override
public void onServiceConnected(){
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
this.setServiceInfo(info);
Toast.makeText(this,"Connected",Toast.LENGTH_LONG).show();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
Toast.makeText(this,"Got event",Toast.LENGTH_LONG).show();
final int selectBegin = event.getSource().getTextSelectionStart();
final int selectEnd = event.getSource().getTextSelectionEnd();
if (selectBegin == selectEnd)
{
return;
}
String text = event.getText().toString().substring(selectBegin,selectEnd + 1);
the rest of code...
}
@Override
public void onInterrupt()
{
return;
}
@Override
public void onDestroy()
{
super.onDestroy();
Toast.makeText(this,"Stopped",Toast.LENGTH_LONG).show();
}
这应该在 selection 发生后从任何其他应用程序获取文本。
它仅适用于我的应用程序,我使用带有随机文本的 TextView 创建了 activity,在我 select 它之后,事件被正确抛出。但是在进入任何其他应用程序后,例如 chrome,一些随机的 pdf reader 应用程序,不会引发任何事件,至少不会引发我正在收听的这个。
@编辑
从 xml 中删除了这一行。现在事件被抛出,但是 selection 的索引是 -1 和 -1
android:packageNames="com.example.jakubjab.getselectedtext"
至少你的 XML 配置是关闭的:
android:packageNames="com.example.jakubjab.getselectedtext"
您需要省略此行。 packageNames 参数限制您从中获取事件的包。不设置导致从每个包中获取事件。
根据您对问题的解释,我想这会解决您的问题。至少,这是一个问题,如果不能正确解决,您可能需要提供更多详细信息。
我正在创建需要在其他应用程序中获取 selected 文本的 AccesibilityService。
我的 xml 服务资源如下所示:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewTextSelectionChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"/>
和java代码
@Override
public void onServiceConnected(){
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
this.setServiceInfo(info);
Toast.makeText(this,"Connected",Toast.LENGTH_LONG).show();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
Toast.makeText(this,"Got event",Toast.LENGTH_LONG).show();
final int selectBegin = event.getSource().getTextSelectionStart();
final int selectEnd = event.getSource().getTextSelectionEnd();
if (selectBegin == selectEnd)
{
return;
}
String text = event.getText().toString().substring(selectBegin,selectEnd + 1);
the rest of code...
}
@Override
public void onInterrupt()
{
return;
}
@Override
public void onDestroy()
{
super.onDestroy();
Toast.makeText(this,"Stopped",Toast.LENGTH_LONG).show();
}
这应该在 selection 发生后从任何其他应用程序获取文本。
它仅适用于我的应用程序,我使用带有随机文本的 TextView 创建了 activity,在我 select 它之后,事件被正确抛出。但是在进入任何其他应用程序后,例如 chrome,一些随机的 pdf reader 应用程序,不会引发任何事件,至少不会引发我正在收听的这个。
@编辑 从 xml 中删除了这一行。现在事件被抛出,但是 selection 的索引是 -1 和 -1
android:packageNames="com.example.jakubjab.getselectedtext"
至少你的 XML 配置是关闭的:
android:packageNames="com.example.jakubjab.getselectedtext"
您需要省略此行。 packageNames 参数限制您从中获取事件的包。不设置导致从每个包中获取事件。
根据您对问题的解释,我想这会解决您的问题。至少,这是一个问题,如果不能正确解决,您可能需要提供更多详细信息。