我想创建一个能够扫描"其他应用程序和布局,并找出是否有按钮等。 有些应用程序,比如whatsapp,不允许第三部分进入应用程序,因此我使用可访问性可能是解决方案。 现在的问题是我从未使用过辅助功能,所以有人可以请你告诉我如何扫描"应用程序的布局找到按钮? 非常感谢
答案 0 :(得分:0)
您正在寻找的是辅助功能服务。配置辅助功能服务有点复杂。我已经建立了一个可访问性样板代码库,该代码设置了一个AccessibilityService,它将节点层次结构记录到LogCat,并将默认项目设置活动设置为它的设置活动。以下是一些亮点,因为我不喜欢发布github repos作为答案。请注意,我使用了很多自己的库。 CLog是一个日志库,AndroidAccessibilityUtils用一些常用的实用程序函数包装节点信息。您可以在底部的github repo上的build.gradle文件中找到对依赖项的引用。以下是一些代码亮点。
您的manifest.xml文件将与Activity明显不同,并且应该在Application元素中包含这样的条目:
<application .... >
...
<service
android:name="com.moba11y.basicaccessibilityservice.BasicAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/service_config" />
</service>
...
</application>
首先,您需要创建辅助功能服务的子类:
public class BasicAccessibilityService extends AccessibilityService {
static {
CLog.initialize(BasicAccessibilityService.class.getSimpleName(), BuildConfig.DEBUG);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
CLog.d(event.toString());
switch (event.getEventType()) {
//On Gesture events print out the entire view heirarchy!
case AccessibilityEvent.TYPE_GESTURE_DETECTION_START:
CLog.d(A11yNodeInfo.wrap(getRootInActiveWindow()).toViewHeirarchy());
default: {
//If the event has a source, let's print it out separately.
if (event.getSource() != null) {
CLog.d(A11yNodeInfo.wrap(event.getSource()).toViewHeirarchy());
}
}
}
}
@Override
public void onInterrupt() {
CLog.e("Service Interrupted: Have never actually had this happen.");
}
}
这是大部分亮点。你还应该有一个&#34; service_config&#34;具有属性的XML,如Manifest XML文件的更改中所引用。更多细节和合理的观点可以在GitHub上的开源回购中找到。
https://github.com/chriscm2006/Android-Accessibility-Service-Boilerplate