美文网首页
AccessibilityService开发自动化脚本

AccessibilityService开发自动化脚本

作者: GDHuo | 来源:发表于2019-04-16 14:36 被阅读0次

使用AccessibilityService执行自动化脚本需在7.0以上
1.分析目标页面
众所周知,分析android页面可以使用Android Studio中的Layout Inspector,但是仅限于自己编译出来的页面,对于没有源码的apk就无能为力了。
下面分享下不需要源码就能分析目标页面的方法
方法1 adb shell uiautomator dump 然后pull出来可以看到当前页面的node布局树

方法2 进入android SDK 找到tools/bin/uiautomatorviewer 运行可以查看到目标页面

2.Web页面无法获取到node怎么分析
可以通过以下方法获取到web页面的node,但是class都是View,只能通过contentDescription获取到描述来分析。也可以执行点击(如果不执行那就用父节点执行点击)
在AccessibilityService 的xml配置文件中设置flagRequestEnhancedWebAccessibility及 android:canRequestEnhancedWebAccessibility="true"

<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/operation_desc"
    android:accessibilityEventTypes="typeAllMask"
    android:packageNames="cn.xuexi.android"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:notificationTimeout="500"
    android:accessibilityFlags="flagRequestEnhancedWebAccessibility|flagDefault"
    android:canRetrieveWindowContent="true"
    android:canRequestFilterKeyEvents="true"
    android:canRequestTouchExplorationMode="true"
    android:canRequestEnhancedWebAccessibility="true"
    android:canPerformGestures="true"
    />

在onServiceConnected的时候设置AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY的flag

@Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        getServiceInfo().flags |= AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
    }

注意:修改后卸载apk重新安装,如果还是获取不到那就卸载后重启重新安装apk。

3.onKeyEvent不起作用
xml配置里需要添加
android:accessibilityFlags="flagRequestFilterKeyEvents"
但是只能监听到物理按键,对华为等下面有虚拟home recent键的就检测不到了

4.检测home键以及Recent键
在service的onCreate中注册广播

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(receiver,filter);

private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String reason = intent.getStringExtra("reason");
            Log.d(TAG,"onReceive "+reason);
            if("homekey".equals(reason)) {
                Log.d(TAG,"user click homekey");
            } else if("recentapps".equals(reason)) {
                Log.d(TAG,"user click recentapps");
            }
        }
    };

相关文章

网友评论

      本文标题:AccessibilityService开发自动化脚本

      本文链接:https://www.haomeiwen.com/subject/zwbwbqtx.html