gpt4 book ai didi

java - 如何读取窗口内容(使用accessibilityService)并在Android中使用draw over other app权限唤起UI?

转载 作者:IT老高 更新时间:2023-10-28 20:53:08 27 4
gpt4 key购买 nike

我的last关于同一主题的问题不够清楚,被社区搁置,后来被自动删​​除。因此,我正在详细解释该问题,以便社区可以更好地理解和帮助。

我想要类似于 Voodoo App 的功能和 MySmartPrice优惠。

现在他们在做什么

第 1 步:当我们第一次打开 Voodoo 应用程序时,它们会显示一个小教程。在教程结束时,有一个“立即激活”按钮,按下该按钮后,我们将进入辅助功能设置屏幕。

第 2 步:在辅助功能屏幕中,它进一步指导如何查找和禁用 Voodoo 服务。

第 3 步:当我们启用它时,它会进一步要求授予“观察您的操作”和“检索窗口内容”权限。

第 4 步:一旦我们在无障碍屏幕上授予权限,然后移动到某个购物应用或通过浏览器访问购物网站并到达产品页面,就会自动弹出一个 voodoo float 按钮。

第 5 步:一旦我们点击它,它就会显示在其他应用程序或网站上可用的相同/相关/相似产品的价格,以便用户查看可用的最优惠价格。

Voodoo 引用截图

Voodoo Screen 1

Accessibility screen

Accessibility screen 2

Permission Granting Screen

Voodoo Screen 2

Voodoo Floating Button on product page

Voodoo Results with the help of draw over other app

现在我想从社区了解什么:

  1. 如何在辅助功能屏幕和产品详细信息页面上显示我的帮助 UI。
  2. 如何检测产品页面何时出现在屏幕上并唤起我的 float 按钮。
  3. 如何获取屏幕上显示的产品名称。
  4. 如何仅针对某些应用限制此屏幕阅读功能? (因为我不想最终遇到一些版权问题)
  5. 有什么教程可以帮助我吗?尽管我已经在 Google 上尝试过任何直接教程,但没有取得任何成功。

现在为什么我需要这些信息:

我正在为学生计划一个应用程序,如果它可以在我的服务器上或在某些可访问的网络位置上获得,它将帮助他们免费获得想要的(或类似的)书籍(电子书)。由于某些书籍的版权问题,我只想将其功能限制为某些应用程序。

现在我从关于这个主题的研究中了解到(但我不确定我是否走在正确的轨道上)

最佳答案

我曾试图在一篇博文中总结我是如何解决这个问题的。任何需要帮助的人都可以查看它。

Accessibility Service to the next level

我之前的回答已被版主删除,可能是因为我刚刚发布了博客链接。所以我也在这里再次发布我的答案并附上详细信息。

最简单的方法是android自己提供的。如果您在自己的应用程序上构建一些东西,这是最好和最简单的方法。您必须使用“findAccessibilityNodeInfosByViewId()”如下所述

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = source.findAccessibilityNodeInfosByViewId("YOUR PACKAGE NAME:id/RESOURCE ID FROM WHERE YOU WANT DATA");
if (findAccessibilityNodeInfosByViewId.size() > 0) {
AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);
// You can also traverse the list if required data is deep in view hierarchy.
String requiredText = parent.getText().toString();
Log.i("Required Text", requiredText);
}
}

如果您在其他应用上构建某些东西并且不知道资源 ID。您必须结合父级、子级计数、找到数据的级别、事件类型来构建逻辑。您必须在事件或源中寻找模式或上述值的组合,以获取所需的数据。此外,您必须在代码中进行一些调整,以根据您的任务获取准确的数据。就像在我们的任务中一样,我们有一些正则表达式来获取宝贵的数据。

您必须注意,如果 View 或 UI 发生更改或 res id 发生更改,您当前的逻辑可能会失败。因此,您必须密切关注您正在构建服务的应用程序。以下是一些示例代码,我们在其中获取不带 res id 的数据,这可能有助于您了解它的工作原理。

打印源和事件

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
Log.i("Event", event.toString() + "");
Log.i("Source", source.toString() + "");
}

获取childcount

source.getChildCount();

如果 child 数 >0,您可能需要查看它。

示例代码 1

if (level == 0 && source.getClassName().equals("android.widget.TextView") && source.getText()!=null && !source.getText().toString().isEmpty()){
// here level is iteration of for loop
String recivedText = source.getText().toString();
if(source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.FrameLayout") && source.getParent().getParent()==null){
return recivedText;
}
}

示例代码 2

if (source.getPackageName().equals("PACKAGE NAME OF APP FOR WHICH YOUR EXPECTING EVENT")) {
if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "COMPLETE NAME OF ACTIVITY CLASS WITH PACKAGE NAME (if you want it for some specific screen)".equals(event.getClassName())){
if(source.getText()!=null && source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.RelativeLayout")&& source.getParent().getParent()!=null && source.getParent().getParent().getClassName().equals("android.widget.ScrollView") && source.getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getClassName().equals("android.support.v4.view.ViewPager")&& source.getParent().getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getParent().getClassName().equals("android.widget.FrameLayout")&& source.getParent().getParent().getParent().getParent().getParent()==null){
return source.getText().toString();
}
}

这有点笨拙,但要使其正常工作,您必须深入查看日志以找到将您带到所需数据的模式。

2017 年 11 月 20 日更新谷歌正在暂停所有使用无障碍服务的应用程序,而不是无障碍服务。我收到了一封关于我的一个应用程序的电子邮件,其他开发人员也收到了来自谷歌的相同电子邮件 (Reddit)。所以,我认为我们应该寻找一些其他的做事方式,我请求你也请在这里更新它,如果有人想出其他实现来实现相同的行为,它也会帮助其他人。

谢谢乌梅什·乔汉

关于java - 如何读取窗口内容(使用accessibilityService)并在Android中使用draw over other app权限唤起UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35842762/

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