标签: accessibility-api

以编程方式启用辅助设备的访问权限

我想以编程方式在"系统偏好设置"中为辅助设备启用Access.但问题是我的应用程序没有以root用户身份运行,我不希望我的应用程序成为root用户,也不应该要求在它们之间进行任何身份验证.

我想全局点击所有键盘事件.我正在使用CGEventTapCreate().在CGEventTapCreate()API的文档中,提到了,如果满足下列条件之一,则事件抽头接收密钥和密钥事件:

  1. 当前进程以root用户身份运行.
  2. 启用辅助设备访问.在Mac OS X v10.4及更高版本中,您可以使用"系统偏好设置","通用访问"面板,"键盘"视图启用此功能.

我通过从系统首选项检查辅助设备的启用访问来手动尝试,它给了我预期的输出.

那么有什么方法可以通过程序执行相同的操作而不需要身份验证,并且应用程序也不是以root用户身份运行的?

谢谢,

Dheeraj.

scripting cocoa accessibility objective-c accessibility-api

7
推荐指数
1
解决办法
3688
查看次数

抓住toast事件(来自任何应用程序)并获取toast消息

据我所知,这是可能的,从这里 检测toast消息 但是我无法通过链接捕获任何带有代码片段的事件.

MyAccessibilityService.java

package com.test.toasts2;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Notification;
import android.os.Parcelable;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        System.out.println("event catched");
        Toast.makeText(this, "catched " + "!", Toast.LENGTH_SHORT).show();
        if(event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
            return; // event is not a notification

        String sourcePackageName = (String)event.getPackageName();

        Parcelable parcelable = event.getParcelableData();
        if(parcelable instanceof Notification){
            // Statusbar Notification
        }
        else{
            // something else, e.g. a Toast message
            String log = "Message: "+event.getText().get(0)+" [Source: "+sourcePackageName+"]";
            System.out.println(log);
            // …
Run Code Online (Sandbox Code Playgroud)

android accessibility-api toast android-4.0-ice-cream-sandwich

7
推荐指数
1
解决办法
5692
查看次数

如何使用沙盒应用程序的辅助功能?

OS X有一个很好的功能,如Accessibility API,它允许从您的应用程序代码控制一些系统元素和另一个应用程序.但是在打开Sandbox后它就会停止工作.要向商店提交应用程序,必须启用沙盒.

这就是Apple所说的:

使用App Sandbox,您可以并且应该启用应用程序的可访问性,如本文档中所述.但是,您无法对辅助应用程序(如屏幕阅读器)进行沙箱处理,也无法对控制其他应用程序的应用程序进行沙箱处理.

但App Store有一些使用Accessibility API的应用程序:

  • Cinch - 调整Windows大小
  • BetterSnapTool - 同样的
  • PopClip - 获取所选文本

所以这意味着可以一起使用Sandbox/Accessibility API/App Store,但是如何?

macos cocoa sandbox objective-c accessibility-api

7
推荐指数
2
解决办法
992
查看次数

如何检查辅助服务是否崩溃(Android Pie 现在在设置中显示此信息)?

我发现 Android 9 现在会在辅助功能服务停止工作时显示信息

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

  • 辅助功能看起来已启用,但服务已停止。为了让它恢复工作,需要关闭然后重新打开辅助功能。

  • 如果谷歌完全修复了这个问题,我会很高兴,但现在他们只是显示一个提示,最好手动禁用-启用它。

不是最好的东西,但至少是一些东西。

  • 因此,我试图找出系统如何知道服务是否崩溃。碰巧有一个名为AccessibilityUtil的类,它包含hasServiceCrashed方法。

  • 不幸的是,它检查了 AccessibilityNodeInfo 中的隐藏字段crashed,该字段不适用于第三方开发人员(因为反射拒绝)以及以前的 Android 版本。

因此,我想知道是否有其他方法可以从系统获取信息,以澄清我的辅助功能服务已崩溃/停止工作并且需要用户执行操作。从棒棒糖开始。提示表示赞赏。

android accessibility accessibility-api accessibilityservice

7
推荐指数
2
解决办法
3347
查看次数

辅助功能服务:获取可以立即与之交互的视图(与“语音访问”相同)?

我们的目标是获得可与之交互的观点立刻(可以单击现在有什么东西会发生)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。

语音访问可以做到这一点。它似乎使用了Accessibility API。

完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用突出显示。


那我们有什么呢?

  • 有一个AccessibilityEvent流。最有用的是 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,因此可以在发生事情时通知我们。
  • 使用getSource(),我们可以获取触发事件的AccessibilityNodeInfo的实例。或者我们可以使用AccessibilityService.getRootInActiveWindow()获得窗口的根。有了它,我们就可以遍历应用程序内的整个层次结构。
  • AccessibilityNodeInfo不提供有关视图的z顺序的任何信息,因此无法了解上方和下方的内容。
  • 底部菜单在同一窗口中(不是模式窗口)。
  • 如果在展开底部菜单时尝试单击“沿路线搜索”按钮,则底部菜单会折叠。因此,您实际上无法单击它,它在菜单下面。
  • 我已经通过的所有参数看上去AccessibilityNodeInfo一样isVisibleToUser()isClickable()isContextClickable()isSelected()isFocusable()isFocused()isAccessibilityFocused()和按钮具有相同的参数时,底部菜单被折叠/展开。用户可见,可聚焦和可点击。

  • 我研究了隐藏的API,没有发现任何有用的东西。

我想念的是什么?


在此处输入图片说明

android accessibility accessibility-api accessibilityservice android-accessibility

6
推荐指数
1
解决办法
128
查看次数

Android无法使用辅助功能服务在少数设备上阅读窗口内容

我的要求:从特定应用的弹出窗口,对话框等中读取文本.

我已经实现了一个辅助功能服务,我按照我的要求接收了适当的事件和数据.然而,在测试时,我意识到在某些设备上而不是使用AlertDialog或Dialog,他们使用了一个活动(主题为对话框).因此,在我的辅助功能事件中,我只收到活动标题,是否有一种方法可以找到此特定弹出活动显示的文本?

我搜索得非常努力,但在这个主题上得不到多少帮助,文档也没有任何好处.可访问性服务的代码并不多,但如果您仍然需要,我会稍后发布.

谢谢

android accessibility-api accessibilityservice

5
推荐指数
1
解决办法
4542
查看次数

Android 无障碍服务 - 屏幕更新不一致

我有一个 AndroidAccessibilityService部署到运行 Android 5.0.1 的三星 Note 4。

我使用 WhatsApp 作为测试平台,但这适用于任何应用程序,而且更多的是关于辅助功能服务如何触发事件的问题。

2048 (TYPE_WINDOW_CONTENT_CHANGED)Android 触发的事件不一致。如果我将消息发送到我的 WhatsApp 并将其聚焦并且在 75% 的时间屏幕上触发此事件,有时根本不会触发。

是否有一个原因?可访问性事件是否不可靠..?

此外,4096 (TYPE_VIEW_SCROLLED)当用户滚动或当 WhatsApp 的聊天窗口中出现新的信件时,事件似乎确实会持续触发,但是,似乎没有办法确定设备的当前滚动位置是什么?AccessibilityEvent.getSource()提供对列表的一些元数据的访问(在本例中为 android:id/list),但是没有关于此列表或其子元素的滚动位置的可用信息。子列表与屏幕上显示的内容相关,并且boundsToScreen/Parent无论您是查看列表底部还是中间或顶部,值都是相同的。是否有任何线索可以帮助我从所AccessibilityEventNodeInfo呈现的实例中确定滚动位置?

最后,当2048 (TYPE_WINDOW_CONTENT_CHANGED)事件触发时,有时新元素实际上不可用AccessibiltyEvent.getSource()(即使您通过 while 循环迭代到根元素getParent(),然后再次向下扫描)。在将更改应用于 UI 之前,该事件似乎正在拍摄屏幕快照。Athread.sleep没有帮助 - 看起来AccessibilityEventNodeInfo它更像是一个快照而不是对 UI 的实时访问?有什么办法解决这个问题吗?

android accessibility accessibility-api accessibilityservice android-accessibility

5
推荐指数
1
解决办法
2202
查看次数

如何向 AccessibilityService 发送自定义事件?

我的程序目的:触发服务中的 BACK 按钮

我尝试了很多方法,没有人能达到这个目的,最后我发现了AccessibilityService,它可能是实现这个功能的最可能的方法。

我创建了这个 AccessibilityService,并测试了它的工作

package com.accessibilityservice;

public class MyAccessibilityService extends AccessibilityService {
    public MyAccessibilityService() {
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

        performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);

    }

    @Override
    public void onInterrupt() {

    }
}

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="desc"
    android:notificationTimeout="100"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />
Run Code Online (Sandbox Code Playgroud)

然后我尝试转向performGlobalAction服务,但它没有执行该操作。

public class MyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        MyAccessibilityService mas=new MyAccessibilityService();
        mas.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还尝试以不同的方式发送自定义事件,但没有人可以发送到 MyAccessibilityService

@Override
public int onStartCommand(Intent intent, int flags, …
Run Code Online (Sandbox Code Playgroud)

android accessibility-api android-service accessibilityservice android-accessibility

5
推荐指数
1
解决办法
3733
查看次数

Android 辅助功能服务在 Oreo 上一两天后停止工作

背景:

我有一个类从 延伸而来AccessibilityService。每当窗口更改时,都会调用以下函数,该函数为我提供前台应用程序的应用程序名称。

@Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

}
Run Code Online (Sandbox Code Playgroud)

以下是我设置的配置:

 @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        //Configure these here for compatibility with API 13 and below.
        AccessibilityServiceInfo config = new AccessibilityServiceInfo();
        config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

        if (Build.VERSION.SDK_INT >= 16) {   //Just in case this helps
            config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
        }
        setServiceInfo(config);
    }
Run Code Online (Sandbox Code Playgroud)

辅助服务.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_explanation"
android:accessibilityEventTypes="typeWindowStateChanged|typeAllMask"
android:accessibilityFeedbackType="feedbackSpoken|feedbackHaptic|feedbackAudible|feedbackVisual|feedbackGeneric|feedbackAllMask"
android:notificationTimeout="100" android:canRetrieveWindowContent="true" />
Run Code Online (Sandbox Code Playgroud)

问题: 它在一段时间内工作正常,但一两天后突然停止工作。它不调用该onAccessibilityEvent(AccessibilityEvent event)函数。虽然该应用程序的辅助功能已启用,但在窗口更改时仍然不显示应用程序名称。

如果应用程序从睡眠模式恢复,它可能无法工作?我必须在调试版本之上重新安装应用程序,然后它再次开始工作,但持续了多长时间。

问题:如何确保在窗口更改时它始终返回应用程序名称?

accessibility accessibility-api accessibilityservice

5
推荐指数
1
解决办法
2083
查看次数

什么是 AXReplaceRangeWithText macOS 辅助功能属性?

在 macOS Mojave 10.14 中,当对许多应用程序的鼠标下的 UI 元素调用 AXUIElementCopyAttributeNames() 函数时,结果中会出现新的 AXReplaceRangeWithText 属性。但是,当我在 UI 元素上调用 AXUIElementCopyAttributeValue() 函数并传递 AXReplaceRangeWithText 属性时,它会导致目标应用程序崩溃,或者如果它是文本字段或文本区域,则会在目标应用程序中输入垃圾文本。

谁能解释一下 AXReplaceRangeWithText 属性是什么、如何使用它、它的作用以及谁负责它?Apple 没有记录它,也没有出现在辅助功能 API 头文件中。我向 Apple 提交了错误报告,但没有看到任何行动。

macos user-interface accessibility-api

5
推荐指数
0
解决办法
168
查看次数