AccessibilityService - PerformGlobalAction 无法在自己的应用程序中工作

2024-01-30

我正在尝试通过发送系统返回新闻事件AccessibilityService这工作正常,但前提是我不在自己的应用程序中。

我总是得到true from performGlobalAction无论我是否在自己的应用程序中,但只有当我不在自己的应用程序中而是在任何其他应用程序中时,我才会看到该事件确实被执行(从某种意义上说,显示了上一个活动或类似的活动) )

有什么想法为什么会发生这种情况吗?我的应用程序是一个侧边栏应用程序,在顶部绘制了一个覆盖层WindowManager一切正常(AccessibilityService正在运行并正在处理我的自定义事件,并且该服务始终返回我的事件的成功消息,但我自己的应用程序不会对后退按钮事件做出反应)。

我的服务如下所示:

public class MyAccessibilityService extends AccessibilityService {

    public static void sendBackIntent(Context context) {
        Intent intent = new Intent(context, MyAccessibilityService.class);
        intent.putExtra("action", GLOBAL_ACTION_BACK);
        context.startService(intent);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Bundle extras = intent.getExtras();
        Integer action = null;
        if (extras != null) {
            action = extras.getInt("action");
        }

        if (action != null) {
            switch (action) {
                case GLOBAL_ACTION_BACK:
                    boolean result = performGlobalAction(action);
                    L.d("Action %d executed: %b", action, result);
                    break;
                default:
                    L.e("Unhandled action %d", action);
                    break;
            }
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

    }

    @Override
    public void onInterrupt() {
    }
}

Edit

为了明确这一点:

  • 我不通过以下方式启动此服务MyAccessibilityService.sendBackIntent(context),我发送如下意图:if (isAccessibilityserviceRunning) MyAccessibilityService.sendBackIntent(context)
  • 我通过系统服务菜单启动我的服务,只需在那里启用它,然后让系统自动启动它
  • 我已经为AccessibilityService in an accessibilityservice.xml并使用它来定义我的服务设置,这也工作得很好,我想要接收的所有事件都被可靠且正确地接收

EDIT 2

似乎在我的情况下,我的覆盖层仍然窃取焦点,使其可聚焦,并且不存在有时会产生问题的时序问题。不过,我的解决方案可以通过使用来改进BroadcastReceiver与服务进行通信,作为startService正如已接受的答案中所讨论的那样,呼叫不安全


我觉得你正在做一些非常奇怪的事情。看来您正在治疗您的AccessibilityService作为一个正常人Service。这部分表明这是您对方法的以下实现:

public static void sendBackIntent(Context context);

@Override
public int onStartCommand(Intent intent, int flags, int startId);

只需通过这两个方法的签名和您的调用

context.startService(intent);    

在你的静态方法中,我可以看出你不明白AccessibilityServices以及他们应该如何履行自己的工作。您无法按照您尝试的方式启动辅助服务,也无法与其交互。当然,您可以使用辅助功能服务来执行全局操作,但它们不会在全局范围内准确地执行此操作,除非您从“辅助功能服务”菜单(您知道 TalkBack 显示的菜单)正确启动它们。

您的代码本质上并没有在您认为它运行的上下文中运行。因此,它运行并执行操作。但,AccessibilityServices它们各自的力量在于它们全局连接到操作系统的能力。当您尝试使用以下方式启动服务时,android API 将无法正确绑定 AccessibilityService:

context.startService(intent);

您必须从“辅助功能服务设置”菜单启动辅助功能服务。

即使您的服务已经启动,这样的调用也是不安全的!无法保证您的用户会在打开您的活动之前启动该服务。一旦你打过电话context.startService并尝试以这种方式启动您的 AccessibilityService,它将阻止辅助功能设置菜单启动您的服务并正确绑定到操作系统。事实上,一旦遇到这种情况,用户必须:在辅助功能设置菜单中关闭服务的开关,强制停止(甚至可能卸载)您的应用程序,重新启动设备,启动您的服务,然后启动您的活动,为了实现正确的行为。

如果不这样做,它将无法正确绑定到操作系统,并且其行为是未定义的。现在,您基本上已经在操作系统中创建了一个 hack,并且正在遇到上述未定义的行为,这些行为可能会因版本、制造商等而有很大差异,因为它的行为没有包含在 AOSP 集成测试中。

事实上,您明确不能使用以下方式启动辅助服务:context.startService()称呼。这是 Android 的一个非常重要的安全功能,因为辅助服务可以访问屏幕内容,并且用户需要对其允许访问的提供商和应用程序进行细粒度控制。因此,虽然您可能会遇到一些行为,但这是未定义且危险的行为。你想要的是类似下面的东西:

使用以下服务配置 XML:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:accessibilityEventTypes="typeWindowContentChanged"
    android:accessibilityFlags="flagRequestTouchExplorationMode"
    android:canRetrieveWindowContent="true"
    android:canRequestTouchExplorationMode="true"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:notificationTimeout="100"
    android:settingsActivity="com.service.SettingsActivity"
    />

以及以下无障碍服务。

class MyA11yService extends AccessibilityService {
    @Override public boolean onGesture(int gestureId) {
        switch (gestureId) {
            case GESTURE_SWIPE_UP_AND_DOWN:
                CLog.d("Performing gesture.");
                performGlobalAction(GLOBAL_ACTION_BACK);
                return true;

            default:
                return false;
        }
    }
}

The performGlobalAction通话在任何情况下都可以正常工作Context。现在,您要做的不是在 SWIPE_UP_DOWN 手势上执行此操作,而是与您希望能够触发“全局后退按钮”操作的部分建立某种进程间通信。但是,该信息是针对另一个问题的,尽管如果您理解本文中的信息,我确信您需要如何继续进行将会很清楚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AccessibilityService - PerformGlobalAction 无法在自己的应用程序中工作 的相关文章

  • Android-如何将 android.net.Uri 对象转换为 java.net.URI 对象?

    我正在尝试获得一个FileInputStream用户从图片库中选择的图像上的对象 这是安卓URI由返回android provider MediaStore Images Media INTERNAL CONTENT URI content
  • 如何在 Android 中更改 Drawable 的颜色?

    我正在开发一个 Android 应用程序 并且我有一个从源图像加载的可绘制对象 在此图像上 我想将所有白色像素转换为不同的颜色 例如蓝色 然后缓存生成的 Drawable 对象 以便稍后使用它 举例来说 假设我有一个 20x20 PNG 文
  • 如何替换 Android 中已弃用的 Bundle/Argument get(key) 调用

    我有以下扩展函数 允许我在应用程序活动和片段之间传递捆绑数据项 inline fun
  • 应用程序在加载 xml 布局文件的主线程中做了太多工作

    我正在制作一个 9x9 数独网格 其中 81 个单元格本身就是一个 3x3 网格 单个细胞看起来像这样 1 2 3 4 5 6 7 8 9 每个数字代表该单元格的铅笔注释 我有一个名为 cell layout xml 的文件 表示这种 3x
  • 在 gradle 中,我应该排除分支下的所有依赖项还是只排除根就足够了?

    我已将以下自定义任务添加到我的build gradlefile 为了打印出依赖项的依赖项 This part is useful for finding conflict resolution s between dependencies
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • Ionic 2 RC0 和 Angular 2 最新的 Android 构建错误(ngc:错误:静态解析符号值时遇到错误)

    当我使用构建android时出现错误ionic build android命令 ngc 错误 静态解析符号值时遇到错误 引用本地 非导出 符号 字典 考虑导出符号 原始 ts文件中的位置14 8 解析符号TRANSLATION PROVID
  • React Native Expo StackNavigator 重叠通知栏

    我正在尝试为我的 React Native Expo 应用程序实现导航栏 这里有一个问题 dependencies expo 18 0 3 react 16 0 0 alpha 12 react native 0 45 1 react na
  • 透明 9patch 图像:显示出线条

    我得到了一个透明的 9 补丁图像 其中有 9 条补丁线显示槽 This is the output 显然我不希望水平线可见 这就是我创建 9patch 的方式 This is the final image that is used in
  • 如何使用 SharedPreferences 保存多个值?

    我正在开发一个字典应用程序 在我的应用程序中 我假设用户想要保存最喜欢的单词 我决定使用共享首选项保存这些值 我知道 SQLite 和文件更好 但我坚持使用 SharedPreferences 所以继续使用它 下面是我的代码 Overrid
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 更改 TFS 构建代理的身份

    我们有一个运行集成测试的 TFS 构建代理 其中一些测试会调用 Internet 上的 Web 服务 我们的网络使用代理与互联网通信 由于构建代理在网络服务上的身份下运行 并且网络服务的设置未配置为使用代理 因此测试失败 我该如何执行以下操
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • onTaskRemoved() 在华为和小米设备中没有被调用

    我一直在使用onTaskRemoved 服务中的方法 用于检测应用程序何时通过滑动从设备最近列表中删除 我执行一些日志记录和发生这种情况时需要执行的一些其他操作 它工作完美 然后我在运行Android 6 0的华为设备上检查了这个方法 该方
  • 如何将样式应用于我拥有的所有 TextView? [复制]

    这个问题在这里已经有答案了 可能的重复 设计所有 TextView 或自定义视图 的样式 而不向每个 TextView 添加样式属性 https stackoverflow com questions 6801890 styling all
  • 如何访问我的 Android 程序中的联系人

    我正在制作一个短信应用程序 并且想要访问我的 Android 应用程序中的联系人 我想访问联系人 就像他们在实际联系人列表中一样 选择后 我需要返回到我的活动 在其中我可以向该人发送短信 或者是否可以访问存储联系人的数据库 我的代码如下所示

随机推荐

  • GitHub:如何将开放的拉取请求添加到本地存储库?

    我正在使用NSDate 扩展 https github com erica NSDate Extensions我的 iOS Xcode 项目中的插件 主存储库有一些错误 似乎在两个 Pull 请求中得到了修复 https github co
  • django TypeError:get() 获得关键字参数“invoice_id”的多个值

    我对 python 和 django 比较陌生 我有以下其余 api 视图 class InvoiceDownloadApiView RetrieveAPIView This API view will retrieve and send
  • 缺少rabbitMQ配置文件

    我正在使用 Rabbitmq 3 7 2 和 Erlang 20 2 并且 bydefualt RMQ 配置文件丢失 在以下路径 C Users vxadmin AppData Roaming RabbitMQ config 基于我采取的步
  • 在 Android 上添加的文件夹通过 USB 不可见

    我正在尝试将图片保存在 Android 上的子文件夹中 这是我的一些代码 File path Environment getExternalStoragePublicDirectory Environment DIRECTORY DCIM
  • R - 按列名 AS CHARACTER 对 data.frame 进行排序

    我知道我可以这样订购 data frame test data frame A c 4 2 4 B c 8 3 2 ordered test with test order A B 但是 当列由列名指定为字符变量时 如何完成同样的事情呢 这
  • Lua - 初始化[重复]

    这个问题在这里已经有答案了 我无法在 Arch Linux 下正确初始化 lua Lua 最新版本 这是我的代码 include
  • 为特定风格和 buildType 定义 buildconfigfield

    我有两种口味 比如说香草和巧克力 我还有 调试 和 发布 构建类型 并且我需要 Vanilla Release 的字段为 true 而其他 3 个组合应该为 false def BOOLEAN boolean def VARIABLE VA
  • 检测 window.location 的变化

    我正在尝试检测 window location 中的更改 例如 如果用户尝试重新加载页面 则会收到通知 但我似乎找不到方法来做到这一点 有一些与之相关的事件吗 Thanks The unload当用户离开页面时触发该事件 还有一个befor
  • 异步/同步 JavaScript

    我在理解异步和同步 Javascript 之间的区别时遇到了一些困难 希望有人能对此有所了解 我知道 Javascript 本质上是同步的 但您可以使用异步事件 回调来改变程序流程 但是 如果您调用包含 AJAX 且没有回调的函数 会发生什
  • 通过 url 将参数传递给 python azure 函数

    我试图通过 azure 函数使 hello world 示例适用于 python 基本函数尝试通过 url 检索输入的名称 然后响应 Hello Name 事实证明 通过天蓝色门户提供的示例模板不能开箱即用 基本示例如下所示 import
  • 在 SwiftUI 中根据宽度计算每行的项目数

    这是我之前问题的延伸 在 SwiftUI 中使用获取视图的宽度 https stackoverflow com questions 57577462 get width of a view using in swiftui 57591483
  • apache 到 tomcat:mod_jk 与 mod_proxy

    使用有什么优点和缺点mod jk and mod proxy用 apache 来处理 tomcat 实例 我多年来一直在生产中使用 mod jk 但我听说这是前端 tomcat 的 旧方法 我应该考虑改变吗 会有什么好处吗 这些模块的优缺点
  • 触摸屏平板电脑上的 WPF Scrollviewer

    我正在编写一个 WPF 应用程序 它将在完整的 Windows 8 触摸屏平板电脑 而不是 RT 上运行 但是触摸滚动似乎不起作用 所以我想知道我是否做错了什么或者是否有可能 所以 我有一个带有滚动查看器的 WPF 窗口 在该滚动查看器中
  • pandas 3x3 散点矩阵缺少标签

    我使用以下代码创建一个 pandas 散点矩阵 import numpy as np import pandas as pd a np random normal 1 3 100 b np random normal 3 1 100 c n
  • Jenkins 环境变量在构建后步骤中可用

    据我所知 Jenkins 在构建执行期间设置了某些环境变量 但我的问题是我可以在构建后脚本中访问这些变量吗 我进行了快速测试 但无法从构建后步骤 python 脚本访问 PROJECT NAME 和 BUILD URL 等 有没有办法可以从
  • 如何在linq中直接执行SQL查询

    在 C 和 VS 2008 中 我有一个查询 在这个查询中我连接了多个表 所以我不知道类型 我想知道如何在 linq 中直接运行 sql 查询 IEnumerable
  • tomcat中connectionTimeout的含义

    这个参数对于tomcat来说意味着什么 它被宣布于server xml如下
  • OpenCV K 均值 (kmeans2)

    我正在使用 Opencv 的 K means 实现来对一大组 8 维向量进行聚类 它们聚类得很好 但我找不到任何方法来查看聚类过程创建的原型 这可能吗 OpenCV 似乎只提供对集群索引 或标签 的访问 如果没有 我想是时候自己实现了 我不
  • 为什么我可以在 constexpr 函数内调用非 constexpr 函数?

    考虑以下代码 include
  • AccessibilityService - PerformGlobalAction 无法在自己的应用程序中工作

    我正在尝试通过发送系统返回新闻事件AccessibilityService这工作正常 但前提是我不在自己的应用程序中 我总是得到true from performGlobalAction无论我是否在自己的应用程序中 但只有当我不在自己的应用