获取Android屏幕

时间:2015-06-18 08:14:42

标签: android android-intent android-screen-support

有没有办法获取Android手机屏幕上显示的文字内容。它可能是由任何Android应用程序。

http://i.stack.imgur.com/vMPcD.jpg

例如在上面链接的图像中,我希望得到图像中的所有文本(从“拉里页面”开始到结束“弗雷德史密斯”以及屏幕上所有单词的位置)以及它在屏幕上的各自位置。

2 个答案:

答案 0 :(得分:5)

这可以使用Android的辅助功能(如通用复制应用程序)来实现。

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

为此你需要在清单中声明它:

 <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,并从中提取所需的文本。

注意:这种方式需要“可访问性”权限,只有用户才能提供,而且无法在运行时完成。

您可以在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);
 ...
}

答案 1 :(得分:0)

这可以通过使用&#34; uiautomatorviewer&#34;来完成。此bin文件可以在Android SDK / tools / bin /文件夹中找到。

在终端中运行uiautomatorviewer。

$./uiautomatorviewer
  • 确保已启用USB调试并将设备连接到PC。
  • 点击uiautomator转储按钮
  • 单击文本,您可以复制&#34;节点详细信息&#34;在旁边。

enter image description here

对于webview,上述方法可能无效。

如果您想以编程方式执行此操作,请检查android.getText()方法