我想要功能类似于Voodoo App和MySmartPrice提供.
现在他们做什么
第一步:当我们第一次打开Voodoo应用程序时,他们会显示一个小教程.在教程末尾有一个“激活现在”按钮,当按下时,我们进入辅助功能设置屏幕.
步骤2:在可访问性屏幕中,它进一步指导如何查找和无法使用Voodoo服务.
步骤3:当我们启用它时,它进一步要求授予“观察您的操作”和“检索窗口内容”权限.
步骤4:完成授权无障碍屏幕权限后,通过浏览器移动到一些购物应用程序或访问购物网站,并到达产品页面,将自动弹出一个voodoo浮动按钮.
步骤5:一旦我们点击它,它显示在其他应用程序或网站上可用的相同/相关/类似产品的价格,以便用户可以检查可用的最佳交易.
Voodoo的参考屏幕截图
现在我想知道的形式社区:
>如何在辅助功能屏幕和产品详细信息页面上显示我的帮助界面.
>如何检测什么时候产品页面在屏幕上,唤起我的浮动按钮.
>如何获取屏幕上显示的产品名称.
>如何仅限某些应用程序限制此屏幕阅读功能? (因为我不想在一些版权问题上结束)
有没有可以帮助我的教程?虽然我已经在Google上试过任何直接的教程,但没有取得任何成功.
现在为什么我需要这个信息:
我正在计划一个学生的应用程序,这将有助于他们在我的服务器或某些网站上可用的网站上免费获得所需的(或类似的)书籍(电子书).我想限制某些应用程序的功能,只因为某些书籍上的版权问题.
现在我从关于这个话题的研究中了解到(但我不知道我是否正确的跟踪)
>我可以从Accessibility Service获取帮助
>绘制其他应用程序. Example 1,Example 2
解决方法
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); } }
如果您正在其他应用程序上构建某些内容,并且不知道该编号.您必须构建一个逻辑,并结合使用您的数据的父级,子级数,级别,事件类型.您必须在事件或来源中查找模式或上述值的组合以获得所需的数据.此外,您必须在代码中设置一些调整,以根据您的任务获取准确的数据.像我们的任务一样,我们有一些正则表达式来获取宝贵的数据.
您必须注意,如果视图或UI被更改或更改,则您当前的逻辑可能会失败.因此,您必须仔细查看正在构建服务的应用程序.以下是一些示例代码,其中我们获取的数据没有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+””); }
获取子帐号
source.getChildCount();
如果子计数为> 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(); } }
它有点笨拙,但为了让它工作,你必须深入日志找到一个模式,将带你到你所需要的数据.