我想以编程方式在"系统偏好设置"中为辅助设备启用Access.但问题是我的应用程序没有以root用户身份运行,我不希望我的应用程序成为root用户,也不应该要求在它们之间进行任何身份验证.
我想全局点击所有键盘事件.我正在使用CGEventTapCreate().在CGEventTapCreate()API的文档中,提到了,如果满足下列条件之一,则事件抽头接收密钥和密钥事件:
我通过从系统首选项检查辅助设备的启用访问来手动尝试,它给了我预期的输出.
那么有什么方法可以通过程序执行相同的操作而不需要身份验证,并且应用程序也不是以root用户身份运行的?
谢谢,
Dheeraj.
据我所知,这是可能的,从这里 检测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
OS X有一个很好的功能,如Accessibility API,它允许从您的应用程序代码控制一些系统元素和另一个应用程序.但是在打开Sandbox后它就会停止工作.要向商店提交应用程序,必须启用沙盒.
这就是Apple所说的:
使用App Sandbox,您可以并且应该启用应用程序的可访问性,如本文档中所述.但是,您无法对辅助应用程序(如屏幕阅读器)进行沙箱处理,也无法对控制其他应用程序的应用程序进行沙箱处理.
但App Store有一些使用Accessibility API的应用程序:
所以这意味着可以一起使用Sandbox/Accessibility API/App Store,但是如何?
我发现 Android 9 现在会在辅助功能服务停止工作时显示信息。

对于尝试利用可访问性 API 的开发人员来说,这始终是一个痛苦。
辅助功能看起来已启用,但服务已停止。为了让它恢复工作,需要关闭然后重新打开辅助功能。
如果谷歌完全修复了这个问题,我会很高兴,但现在他们只是显示一个提示,最好手动禁用-启用它。
不是最好的东西,但至少是一些东西。
因此,我试图找出系统如何知道服务是否崩溃。碰巧有一个名为AccessibilityUtil的类,它包含hasServiceCrashed方法。
不幸的是,它检查了 AccessibilityNodeInfo 中的隐藏字段crashed,该字段不适用于第三方开发人员(因为反射拒绝)以及以前的 Android 版本。
因此,我想知道是否有其他方法可以从系统获取信息,以澄清我的辅助功能服务已崩溃/停止工作并且需要用户执行操作。从棒棒糖开始。提示表示赞赏。
android accessibility accessibility-api accessibilityservice
我们的目标是获得可与之交互的观点立刻(可以单击现在有什么东西会发生)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。
语音访问可以做到这一点。它似乎使用了Accessibility API。
完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用未突出显示。
我已经通过的所有参数看上去AccessibilityNodeInfo一样isVisibleToUser(),isClickable(),isContextClickable(),isSelected(),isFocusable(),isFocused(),isAccessibilityFocused()和按钮具有相同的参数时,底部菜单被折叠/展开。用户可见,可聚焦和可点击。
我研究了隐藏的API,没有发现任何有用的东西。
我想念的是什么?
android accessibility accessibility-api accessibilityservice android-accessibility
我的要求:从特定应用的弹出窗口,对话框等中读取文本.
我已经实现了一个辅助功能服务,我按照我的要求接收了适当的事件和数据.然而,在测试时,我意识到在某些设备上而不是使用AlertDialog或Dialog,他们使用了一个活动(主题为对话框).因此,在我的辅助功能事件中,我只收到活动标题,是否有一种方法可以找到此特定弹出活动显示的文本?
我搜索得非常努力,但在这个主题上得不到多少帮助,文档也没有任何好处.可访问性服务的代码并不多,但如果您仍然需要,我会稍后发布.
谢谢
我有一个 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
我的程序目的:触发服务中的 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
背景:
我有一个类从 延伸而来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)函数。虽然该应用程序的辅助功能已启用,但在窗口更改时仍然不显示应用程序名称。
如果应用程序从睡眠模式恢复,它可能无法工作?我必须在调试版本之上重新安装应用程序,然后它再次开始工作,但持续了多长时间。
问题:如何确保在窗口更改时它始终返回应用程序名称?
在 macOS Mojave 10.14 中,当对许多应用程序的鼠标下的 UI 元素调用 AXUIElementCopyAttributeNames() 函数时,结果中会出现新的 AXReplaceRangeWithText 属性。但是,当我在 UI 元素上调用 AXUIElementCopyAttributeValue() 函数并传递 AXReplaceRangeWithText 属性时,它会导致目标应用程序崩溃,或者如果它是文本字段或文本区域,则会在目标应用程序中输入垃圾文本。
谁能解释一下 AXReplaceRangeWithText 属性是什么、如何使用它、它的作用以及谁负责它?Apple 没有记录它,也没有出现在辅助功能 API 头文件中。我向 Apple 提交了错误报告,但没有看到任何行动。
android ×6
cocoa ×2
macos ×2
objective-c ×2
android-4.0-ice-cream-sandwich ×1
sandbox ×1
scripting ×1
toast ×1