android - 获取android屏幕的文字内容

标签 android android-intent android-screen-support

有什么办法可以获取到android手机屏幕上显示的文字内容。它可以通过任何 Android 应用程序。

enter image description here

例如在上面链接的图像中,我希望获取图像中的所有文本(从“Larry Page”开始到“Fred Smith”结束以及屏幕上所有单词的位置)及其在屏幕上的相应位置。

最佳答案

这可以使用 Android 的辅助功能来实现(就像通用复制应用程序所做的那样)。

您需要做的是实现一个名为 AccessabilityService 的类 它可以通过监听器访问所有屏幕 UI。

为此,您需要在 list 中声明它:

 <service android:name=".MyAccessibilityService">
 <intent-filter>
     <action android:name="android.accessibilityservice.AccessibilityService" />
 </intent-filter>
 <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityservice" />

@xml/accessibilityservice 文件是你配置服务的地方,比如要监听哪个包或你想获得什么样的事件:

<accessibility-service
 android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
 android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
 android:accessibilityFeedbackType="feedbackSpoken"
 android:notificationTimeout="100"
 android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
 android:canRetrieveWindowContent="true"/>

在类中覆盖方法:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    Log.v(TAG, String.format(
            "onAccessibilityEvent: type = [ %s ], class = [ %s ], package = [ %s ], time = [ %s ], text = [ %s ]",
            getEventType(event), event.getClassName(), event.getPackageName(),
            event.getEventTime(), getEventText(event)));
}

在该方法中,您应该在 UI 中找到所需的文本/TextView/EditText 并从中提取所需的文本。

注意:这种方式需要 Accessibility 权限,只有用户可以给你,它不能在运行时完成。

您可以在 Android 文档中阅读有关 how to implement an AccessabilityService 的更多信息

编辑:在评论中的问题之后,我添加了代码以从屏幕中的所有文本组件中读取:

    private void printAllViews(AccessibilityNodeInfo mNodeInfo) {
        if (mNodeInfo == null) return;
        String log ="";
        for (int i = 0; i < mDebugDepth; i++) {
            log += ".";
        }
        log+="("+mNodeInfo.getText() +" <-- "+ 
        mNodeInfo.getViewIdResourceName()+")";
        Log.d(TAG, log);
        if (mNodeInfo.getChildCount() < 1) return;
        mDebugDepth++;

        for (int i = 0; i < mNodeInfo.getChildCount(); i++) {
            printAllViews(mNodeInfo.getChild(i));
        }
        mDebugDepth--;
    }

只是不要忘记像这样初始化 AccessibilityNodeInfo 和深度计数器:

public void onAccessibilityEvent(AccessibilityEvent event) {
    mDebugDepth = 0; 
    mNodeInfo = event.getSource();
    printAllViews(mNodeInfo);
 ...
}

关于android - 获取android屏幕的文字内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909926/

相关文章:

android - 当我尝试从EditText捕获时,Android App崩溃

android - 通过 Intent 打开电子邮件客户端(但不发送消息)

android - 为多个屏幕规划自定义屏幕布局

android - 具有各种屏幕尺寸的自定义评分栏

java - 如何在 strings.xml 文件中列出在 MainActivity.java 中创建的字符串

java - android 更好的保存图像选项?

Android 监听 ACTION_DOCK_EVENT

android - 在Android中获取屏幕宽度和高度

java - 如何在 Android 中编辑以编程方式创建的按钮?

android - MotionLayout 进度从 0 跳到 1 无需中间步骤