屏幕放大器app Android 无障碍服务如何执行全局动作与手势?

众多朋友渴望手机操作能更加自动化,恰好Android的无障碍服务就能实现这一点。然而,很多人却不知如何操作。今天,我们就来详细聊聊这个话题。

创建继承类

class MyAccessibilityService : AccessibilityService() {
    /**
     *打开无障碍服务时调用此方法
     */
    override fun onServiceConnected() {}
    /**
     *当系统检测到与无障碍服务指定的事件过滤参数匹配的 AccessibilityEvent
     *时,就会回调此方法。例如,当用户点击按钮,或者聚焦于某个应用(无障碍
     *服务正在为该应用提供反馈)中的界面控件时。出现这种情况时,系统会调用
     *此方法,并传递关联的 AccessibilityEvent,然后服务会对该类进行解释并
     *使用它来向用户提供反馈。此方法可能会在您的服务的整个生命周期内被调用多次。
     */
     override fun onAccessibilityEvent(){}
    /**
     *当系统想要中断您的服务正在提供的反馈(通常是为了响应将焦点移到其他
     *控件等用户操作)时,就会调用此方法。此方法可能会在您的服务的整个生命
     *周期内被调用多次。
     */
     override fun onInterrupt(){}
     /**
      *当无障碍服务关闭时会调用此方法。
      */
     override fun onUnbind(){}
}     

要开始,先得构建一个基于AccessibilityService的类。这可是开启无障碍服务之旅的关键一步。就好比建造一栋房屋,这便是地基。在真正的开发过程中,你需要为这个类设定相应的属性和功能。比如,你可以规定它对各种系统事件的响应方式。一旦这个类创建完成,基础也就打好了,接下来就可以继续进行工作了。同时,在创建过程中,务必注意类名的规范命名屏幕放大器app,以免日后出现调用错误等问题。

对Android开发有一定了解是必须的,若缺乏相关基础,在创建过程中很可能遇到不少错误提示。这时,记得要及时查找并弥补不足之处。


<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/accessibility_service_description"
        android:packageNames="com.example.android.apis"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFlags="flagDefault"
        android:accessibilityFeedbackType="feedbackSpoken"
        android:notificationTimeout="100"
        android:canPerformGestures="true"
        android:canRetrieveWindowContent="true"
        android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
    />

创建配置文件

接下来是建立配置文件。我们需要在res文件夹中新建一个xml文件夹,然后在xml文件夹内创建一个名为accessibility_service_config.xml的文件。这样的文件组织方式是大家普遍遵循的。以我之前参与的一个小型的app自动化项目为例,我完全依照这一结构操作,项目进展得非常顺利。

示例内容的属性解释可能需要查阅相关文章。然而,必须保证配置文件中的设置完全正确,因为这一点直接影响到无障碍服务的顺畅运作。这就像铁路的枕木,一旦其中一块出现问题,整个运行都可能受到影响。

<service android:name=".MyAccessibilityService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
            android:label="@string/accessibility_service_label">
          <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
          </intent-filter>
          <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
</service>

在AndroidManifest.xml中声明

在AndroidManifest.xml文件中,application标签内需添加相应内容。注意,其中的name属性应填写无障碍服务的类名,这是一个唯一标识,务必准确无误。此外,permission属性必须添加,尤其是为了与Android4.1及以上版本兼容,这是确保只有系统才能绑定到该服务的重要条件。同时,intent-filter和meta-data标签各自扮演着重要角色。meta-data标签需正确引用之前创建的配置文件。label属性对应显示内容,这是应用展示时的直观体现。我之前因label内容设置不当,导致显示混乱不堪。

这一环节至关重要,是各个部分之间的纽带。我们必须对每个属性的设定保持严谨和细致。

编写无障碍操作代码

在各项基础创建完毕后,我们便可以着手编写易于操作的无障碍代码。在此过程中,路径的书写至关重要,path1和path2属于Path对象,需确保正确导入android.graphics.Path包。这就像烹饪,若食材放置不当,菜肴自然难以入口。

点击屏幕上的特定位置,还需遵循一定的书写规则。只有依照规范来操作,才能确保动作的准确性。记得有一次,我误写了一个符号,结果整个单击动作就失败了。

在app中跳转无障碍服务设置

//执行全局动作,api16以上可用
performGlobalAction(GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN)//切换到分屏
performGlobalAction(GLOBAL_ACTION_QUICK_SETTINGS)//打开快速设置,暂时不知道这个有什么用
performGlobalAction(GLOBAL_ACTION_NOTIFICATIONS)//打开通知栏
performGlobalAction(GLOBAL_ACTION_BACK)//模拟back键
performGlobalAction(GLOBAL_ACTION_HOME)//模拟home键
performGlobalAction(GLOBAL_ACTION_RECENTS)//模拟最近任务键
performGlobalAction(GLOBAL_ACTION_POWER_DIALOG)//打开电源键长按对话框
performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN)//锁屏
performGlobalAction(GLOBAL_ACTION_TAKE_SCREENSHOT)//截图

在app中,跳转至无障碍服务设置是一项非常实用的功能。用户可以通过这一操作,轻松地对无障碍服务进行调整。在实际使用中,当需要根据不同场景调整无障碍服务时,这一跳转功能就显得尤为重要。例如屏幕放大器app,在为盲人用户配置服务时,就需要进入设置界面,核实并开启一些特定的功能。

这一功能能够增加用户对无障碍服务的可操作性和自定义性。

//执行手势,api24以上可用
//连缀1个addStroke()表示单点触控
//这里连缀2个addStroke()表示2点触控
//同理,连缀3个addStroke()就表示3点触控,连缀4个addStroke()就表示4点触控
/*StrokeDescription类的构造方法接收3个参数,第一个参数是一个Path对象,第二个参数是手势延迟
多少秒执行,这里设置为0,第三个参数是手势的持续时间*/
var gestureDescription = GestureDescription.Builder()
                    .addStroke(GestureDescription.StrokeDescription(path1, 0, time1))
                    .addStroke(GestureDescription.StrokeDescription(path2, 0, time2))
                    .build()
/*调用此方法执行手势,此方法接收3个参数,第一个参数是上面的
GestureDescription对象,第2,第3个参数一般为null*/                   
dispatchGesture(gestureDescription, null, null)

检查无障碍服务是否开启

最后,务必记得检查无障碍服务是否已经开启。这至关重要,因为一旦你未确认开启,先前的一切努力都将付诸东流。就好比你尽管设定了众多家电的智能模式,却忘了打开电源。无论是开发阶段还是用户使用时,都要确保服务已开启。

我想请教各位,在构建无障碍服务的过程中,你们认为哪个部分最容易出现问题?期待大家的热情讨论和互动,同时,也欢迎点赞并转发这篇文章。

var x1=100f
var y1=200f
var x2=500f
var y2=700f
var x3=900f
var y3=1000f
var path = Path()//创建Path对象
path.moveTo(x1,y1)//此点为路径的起始点
path.lineTo(x2,y2)//将路径从上一个点(x1,y1)连接到此位置
path.lineTo(x3,y3)//将路径从上一个点(x2,y2)连接到此位置
path.close()//将路径从最初点(x1,y1)连接到最末点(x3,y3)

© 版权声明
THE END
喜欢就支持一下吧
点赞275赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容