Android辅助功能基本操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android辅助功能基本操作相关的知识,希望对你有一定的参考价值。

参考技术A

在手机的设置界面,有一个叫辅助功能的设置,点击进去可以看到已安装的辅助服务,点击具体的服务进去可以看到该服务的一些描述,可以在此开启该服务,这也是唯一一个能开启服务的地方。

开启辅助功能相当于开启了一个服务,在手机界面改变的时候,就能监听到该页面的一些信息并且能拿到界面的一些控件,然后可以对控件进行模拟点击,从而实现我们想要的功能。

除此以外,不仅能够对获取到的控件进行模拟点击,在android7.0及以上的版本,我们可以模拟任意位置的点击包括触摸、滑动等等,就是说我们可以实现任何 人能够进行的操作 ,这个是很有用的,可以做出很多有意思的东西,如果再配上截图、录屏和图像识别,就更有意思了。

模拟点击,就是说我们的手机界面自己动,整个流程像是一只手在帮你操作一样的;

新建一个 Service 继承 AccessibilityService

然后去 AndroidManifest 文件里面去注册一下这个Service

在 meta-data 节点下有个 resource 值,这是个xml文件,里面配置了该辅助的一些信息,在res目录下新建一个文件夹,名字叫xml,然后新建一个xml文件,名字和 resource 配置的一样就行了

里面配置了一些参数,比如 notificationTimeout 是指定多少毫秒监听一次界面变化的, packageNames 是指定监听哪个应用的,删掉这个配置就是监听全局, description 是对于该辅助的描述,其他配置不管也罢。

然后在LuckMoneyService里面重写一下onAccessibilityEvent方法

每当界面改变的时候就会回调这个方法,通过 event 我们就可以获取到界面的信息包括界面上的控件

上面的操作都比较基础,根据控件显示的文字查找控件,找出来的肯定是TextView和Button了,根据ID查找控件,ID就是指的写布局文件的时候设置的控件的ID

模拟触摸就是可以模拟人的触摸动作,也比较简单

可以看到需要传入 path 就是一个路径嘛,模拟滑动的路径,用canvas画过画的都知道这东西还是比较简单的, startTime 就是多久后开始模拟事件, duration 就是该滑动的时间,其他回调什么的为空就可以了;

如何获取控件的ID呢,而我又是如何知道界面上有哪些控件呢,可以通过一个工具来实现,就是在sdk工具下面的一个叫 monitor 的工具,其实之前的AndroidStudio是带这个工具的,但是后来界面上是没有了,但是其实还在的

连上手机,打开这个工具,手机上打开你要查看的界面,点击工具手机的小手机的图标,就会截屏,显示出这个界面的信息

辅助功能能做的东西大概就上面这些了,能做出什么功能就靠自己的想象了
推荐阅读: Android微信抢红包辅助

如何在 Android 中启动我的 APP 的辅助功能设置页面?

【中文标题】如何在 Android 中启动我的 APP 的辅助功能设置页面?【英文标题】:How can I start the Accessibility Settings Page of my APP in Android? 【发布时间】:2015-06-04 16:49:42 【问题描述】:

我正在开发一个基于Accessibility 功能的Android APP。由于它不能在 Android 中以编程方式 Enable/Disable Accessibility 服务(参见 How to Programmatically Enable/Disable Accessibility Service in Android),所以我通过下面的代码引导用户到 Accessibility Settings 页面(图 1):

public static boolean gotoAccessibilitySettings(Context context) 
    Intent settingsIntent = new Intent(
            Settings.ACTION_ACCESSIBILITY_SETTINGS);
    if (!(context instanceof Activity)) 
        settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    boolean isOk = true;
    try 
        context.startActivity(settingsIntent);
     catch (ActivityNotFoundException e) 
        isOk = false;
    
    return isOk;

然后用户需要找到我的APP的子设置标签,点击它,现在我的APP显示Accessibility Settings页面(图2)。

我怀疑是否可以直接启动我的APP的Accessibility Settings页面(图2)?

【问题讨论】:

您找到解决方案了吗?我为此而疯狂 @kalok 你有解决办法吗? 大家好,有人找到这个解决方案吗?我也有同样的问题 【参考方案1】:

您可以使用以下 Intent 手动打开辅助功能设置(当 android.content.Intentandroid.app.Intent 都已导入时):

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);

查看以下资源了解更多信息:

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/accessibility/ClockBackActivity.java http://developer.android.com/reference/android/app/Activity.html

【讨论】:

感谢您的回答,@timgws。但是我的问题是直接打开我自己应用的辅助功能设置,而不是辅助功能设置的主页:( 最终这样做了。在我找到更好的访问页面的方法之前,我只是告诉用户点击我的应用并从设置中启用该服务。【参考方案2】:

也许下面的代码可以帮助你:

Intent intent = new Intent();
        intent.setClassName("com.android.settings",
                "com.android.settings.Settings");
        intent.setAction(Intent.ACTION_MAIN);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK
                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT,
                "the fragment which you want show");
        intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS,
                extras);
       startActivity(intent);

或者您可以搜索关键词“Fragment Injection”获取更多信息; 查看此链接,它对您的情况很有用:

http://securityintelligence.com/new-vulnerability-android-framework-fragment-injection

【讨论】:

@money zhang 我应该在“你想显示的片段”中输入什么?我想输入我自己的无障碍服务设置.. 我尝试了我的应用程序名称、包名称服务类名称等,而不是“您要显示的片段”。请告诉我应该输入什么? 根据该链接,此方法不再有效,因为该漏洞已在 Android 4.4 Kitkat 中修复【参考方案3】:

试试这个:

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

【讨论】:

以上是关于Android辅助功能基本操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中制作工具栏(如辅助操作栏)?

如何利用android辅助功能

iOS 13 语音控制辅助功能 - 有没有办法执行更多自定义操作(而不仅仅是链接到辅助功能标签)?

微信辅助软件

Android检测辅助功能是不是开启

在android中使用sqliteopenhelper这个辅助类时,哪些操作可能生成一个数据库