gpt4 book ai didi

android - 如何检查无障碍服务是否崩溃(Android Pie 现在在设置中显示此信息)?

转载 作者:行者123 更新时间:2023-12-04 14:20:51 25 4
gpt4 key购买 nike

我发现现在 Android 9 shows info if accessibility service stopped working .



对于试图利用可访问性 API 的开发人员来说,这一直是一个痛苦。

  • 辅助功能看起来已启用,但服务已停止。为了让它恢复工作,需要关闭并重新打开辅助功能。
  • 如果谷歌能完全解决这个问题,我会很高兴,但现在他们只是暗示手动禁用-启用它是件好事。

  • 不是最好的东西,但至少是一些东西。
  • 所以,我试图找出系统如何知道服务是否崩溃。恰好有一个类叫AccessibilityUtil它包含 hasServiceCrashed方法。
  • 不幸的是,它检查了一个隐藏字段 crashed来自 AccessibilityNodeInfo,它不适用于第三方开发者(因为反射拒绝)以及以前的 android 版本。

  • 所以我想知道是否有另一种方法可以从系统中获取信息,以澄清我的无障碍服务已崩溃/停止工作并且需要用户的操作。从 Lollipop 开始。提示赞赏。

    最佳答案

    我想出了一个想法,使用一个静态 bool 值来指示无障碍服务的状态,并将其与 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES 进行比较.我已经在多台设备上进行了测试,没有发现这种方法有任何问题。
    1.在无障碍服务中声明一个静态 bool 值。

    private static boolean bServiceRunning = false;
    2.在无障碍服务中,设置 onServiceConnected中的 bool 值和 onUnbind
    @Override
    protected void onServiceConnected() {

    super.onServiceConnected();
    bServiceRunning = true; //put this at the very beginning to reduce time gap
    }

    @Override
    public boolean onUnbind(Intent intent) {

    bServiceRunning = false;
    return super.onUnbind(intent);
    }
    3.在Accessibility Service中创建静态函数
    public static boolean bGetServiceStatus(){
    return bServiceRunning;
    }
    使用 bool 标志,我可以知道无障碍服务是否以所需的状态运行。当服务被强制停止时, onUnbind将被调用,因此 bool 值变为 false。
    4.我们使用 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES获取无障碍服务开关状态
    public static boolean bIsAccessibilityServiceEnabled(Context context, Class<?> accessibilityService) {

    ComponentName expectedComponentName = new ComponentName(context, accessibilityService);
    String strServicesSettingResult = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
    if (strServicesSettingResult == null){
    return false;
    }

    TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
    colonSplitter.setString(strServicesSettingResult);

    while (colonSplitter.hasNext()) {
    String strComponentName = colonSplitter.next();
    ComponentName enabledService = ComponentName.unflattenFromString(strComponentName);

    if (enabledService != null && enabledService.equals(expectedComponentName))
    return true;
    }

    return false;
    }
    5.这就是我们想要的,我们用上面两种方法检查确定无障碍服务的真实状态。
    public static int intIsAccessibilityServiceEnabled_WithCrashCheck(Context context, Class<?> accessibilityService){
    //return 0 if Accessibility Service enabled and running
    //return -1 if Accessibility Service disabled and not running
    //return -2 if Accessibility Service enabled but stopped working or crashed

    //first check Accessibility Service boolean

    if(bGetServiceStatus()){
    //service is running
    return 0;
    }else{
    //service not running, now double check with Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
    boolean bResult = bIsAccessibilityServiceEnabled(context, accessibilityService);

    if(!bResult){
    //Accessibility Service is disabled
    return -1;
    }else{
    //Accessibility Service is enabled, but service is not actually running, Accessibility Service is crashed
    return -2;
    }
    }

    }
    使用“AccessibilityManager”也同样有效,但我更喜欢带有静态 bool 值的更“轻量级”版本以获得更好的性能。

    注意:使用 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES没有另一个双重检查将导致错误。该值未同步。结果并不总是代表真实的服务状态。以下步骤可以创建这样的案例:
  • 启动辅助功能服务,然后转到应用设置强制停止应用。
  • 现在您可以看到无障碍服务开关已关闭。 (目前看来够用了,但下一步会出问题)
  • 再次启动无障碍服务,在Android 9.0+的设备上你会发现开关打开了,但服务实际上没有运行,现在它显示“没有
    在职的。点击获取信息。”
  • 关于android - 如何检查无障碍服务是否崩溃(Android Pie 现在在设置中显示此信息)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55061568/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com