zee*_*uge 10 android android-intent android-screen-support
有没有办法获得在Android手机屏幕上显示的文本内容.它可能是由任何Android应用程序.
http://i.stack.imgur.com/vMPcD.jpg
例如,在上面链接的图像中,我希望获得图像中的所有文本(从"拉里页面"开始到结束"弗雷德史密斯"以及屏幕上所有单词的位置)在屏幕上的位置.
这可以使用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" />
Run Code Online (Sandbox Code Playgroud)
文件@ 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"/>
Run Code Online (Sandbox Code Playgroud)
在类中重写方法:
@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)));
}
Run Code Online (Sandbox Code Playgroud)
在该方法中,您应该在UI中找到所需的文本/ TextView/EditText,并从中提取所需的文本.
注意:这种方式需要Accessibility权限,只有用户可以提供,并且无法在运行时完成.
您可以在Android文档中阅读有关如何实现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--;
}
Run Code Online (Sandbox Code Playgroud)
只是不要忘记初始化AccessibilityNodeInfo和深度计数器,如下所示:
public void onAccessibilityEvent(AccessibilityEvent event) {
mDebugDepth = 0;
mNodeInfo = event.getSource();
printAllViews(mNodeInfo);
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5035 次 |
| 最近记录: |