AccessibilityService无障碍服务开发

1.在项目res目录下新建xml文件夹,并在下面新建任意名的xml文件。

例如:res/xml/service_config

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
     android:accessibilityEventTypes="typeAllMask"
     android:accessibilityFeedbackType="feedbackGeneric"
     android:packageNames="com.example"
     android:notificationTimeout="100"
     android:canRetrieveWindowContent="true"
/>
  • packageNames:接收event的包名,多个包名以逗号隔开。如果不设置,默认接收所有应用的event
  • notificationTimeout:接收两个event之间的最短间隔时间
  • canRetrieveWindowContent:是否获取应用的视图信息,如果要获取应用内的View的信息,则必须设置为true
  • accessibilityEventTypes:接收的event类型,如TYPE_VIEW_FOCUSED,TYPE_WINDOW_STATE_CHANGED,TYPE_NOTIFICATION_STATE_CHANGED等等。如接收所有类型,则设置为typeAllMask
  • accessibilityFeedbackType:事件反馈类型,包括震动,声音等

2.新建类继承AccessibilityService,重写方法。

public class MyAccessibilityService extends AccessibilityService
{
   @Override
   protected void onServiceConnected()
   {
      super.onServiceConnected();
      Log.d("lzl", getClass().getSimpleName() + ":onServiceConnected");
   }

   @SuppressLint("NewApi")
   @Override
   public void onAccessibilityEvent(AccessibilityEvent event)
   {
      Log.d("lzl", getClass().getSimpleName() + ":onAccessibilityEvent" + event.getEventType());
      if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
      {
         List<AccessibilityNodeInfo> nodeInfos = event.getSource().findAccessibilityNodeInfosByViewId("com.example:id/login$btn_submit");
         if (nodeInfos == null || nodeInfos.isEmpty())
         {
            return;
         }
         boolean performClick = nodeInfos.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
         if (performClick)
         {
            Toast.makeText(getApplicationContext(), "已点击登录!", Toast.LENGTH_SHORT).show();
         }
      }
   }

   @Override
   public void onInterrupt()
   {
      Log.d("lzl", getClass().getSimpleName() + ":onInterrupt");
   }
   
   @Override
   public void onDestroy()
   {
      super.onDestroy();
      Log.d("lzl", getClass().getSimpleName() + ":onDestroy");
   }
}
其中onAccessibilityEvent()和onInterrupt()是必须重写的,onServiceConnected()和onDestroy()适合在服务开启和关闭时作相应的设置操作。

3.在AndroidManifest.xml中添加service

<service
    android:name="com.zeal4rea.androidtest.MyAccessibilityService"
    android:exported="true"
    android:label="测试无障碍"
    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节点下添加service节点,其中meta-data的resource对应res/xml中新建的xml文件
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值