Android 探究AccessibilityService的秘密

  辅助功能服务是Android框架的一项功能,旨在为安装在Android设备上的应用程序提供替代的导航反馈给用户。 无障碍服务可以代表应用程序与用户进行通信,例如当用户将盘旋在屏幕的重要区域上时,将文本转换为语音或触觉反馈。
  


创建您的辅助功能服务

  辅助服务可以与普通应用捆绑在一起,也可以作为独立的Android项目创建。 在这两种情况下,创建服务的步骤是相同的​​。 在你的项目中,创建一个扩展AccessibilityService的类。
  

/**
 * Created by xiaolong on 2017/6/6.
 */
public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {

    }

    @Override
    public void onInterrupt() {

    }
}

  像任何其他服务一样,您也可以在清单文件中声明它。 记住要指定它处理android.accessibilityservice意图,以便在应用程序触发AccessibilityEvent时调用该服务。
  

<service android:name=".MyAccessibilityService">
         <intent-filter>
         <action android:name="android.accessibilityservice.AccessibilityService"/>
         </intent-filter>
</service>

如果您为此服务创建了一个新项目,并且不打算提供应用程序,则可以从源代码中删除启动器Activity类(通常称为MainActivity.java)。 记住还要从清单中删除相应的活动元素。

配置您的辅助功能服务

  设置辅助功能服务的配置变量会告诉系统您希望运行的方式和时间。 您想要回应哪些事件类型? 服务应该对所有应用程序有效,还是只有特定的软件包名称? 它使用什么不同的反馈类型?
  我们有两种方法来设置这些变量。 向后兼容的选项是使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo)在代码中去配置。 为此,重写onServiceConnected()方法并在其中配置你的服务。
  

 @Override
 protected void onServiceConnected() {
     super.onServiceConnected();
     //获取实例
     AccessibilityServiceInfo info = new AccessibilityServiceInfo();
     //设置此服务想要收听的事件的类型。 其他不会传递给这个服务。
     info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
     //如果您只希望此服务与特定应用程序一起使用,请设置它们包名称在这里。
     //否则,当服务激活时,它将会收听来自所有应用程序的事件。
     info.packageNames = new String []{"com.ooowin.yixue.accessibilityservicetext"};
     //设置您的服务将提供的反馈类型。
     info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
     //仅当没有包特定的服务时才调用默认服务为生成的AccessibilityEvent类型。
     // 这个服务是应用程序特定,因此标志不是必需的。 如果这是一个通用服务,值得考虑设置
     //DEFAULT标志
     //info.flags = AccessibilityServiceInfo.DEFAULT;
       info.notificationTimeout = 100;
       this.setServiceInfo(info);
    }

  第二个方法是使用XML文件配置服务。 某些配置选项(如canRetrieveWindowContent )仅在使用XML配置服务时可用。 以上使用XML定义的相同配置选项将如下所示:
  

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
    android:packageNames="com.ooowin.yixue.accessibilityservicetext"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"/>

这时候我们需要在清单文件中引用它,方法是在您的服务声明中添加一个指向XML文件的标签。

<service android:name=".MyAccessibilityService"
     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/accessibilityservice" />
</service>

请求允许BIND_ACCESSIBILITY_SERVICE权限,确保只有系统可以绑定到它。

响应可访问性事件

  
  现在我们就可以通过AccessibilityEvent.getEventType()来确定事件的类型从而做出一系列操作。
  

        int eventType = accessibilityEvent.getEventType();
        switch(eventType){
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                Log.d("TAG","获取点击事件的响应");
                break;
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                Log.d("TAG","获取焦点的响应");
                break;
        }

结束语

  利用AccessibilityService我们可以在手机非root的情况下实现静默安装的功能(不是真正的静默安装)和现在很多人都知道的抢红包功能。如果你想利用此方法获取一些个人隐私,我劝你还是打消这个念头吧,因为不可能,哈哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章