- 浏览: 2145983 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
对于那些由于视力、听力或其它身体原因导致不能方便使用Android智能手机的用户,Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音、触觉反馈、手势操作、轨迹球和手柄操作。开发者可以搭建自己的Accessibility服务,这可以加强可用性,例如声音提示,物理反馈,和其他可选的操作模式。
随着Android版本的不断升级,Android Accessibility功能也越来越强大,Android 4.0版本以前,系统辅助服务功能比较单一,仅仅能过单向获取窗口元素信息,比如获取输入框用户输入内容。到Android 4.1版本以后,系统辅助服务增加了与窗口元素的双向交互,此时可以通过辅助功能服务操作窗口元素,比如点击按钮等。
由于系统辅助服务能够实时获取您当前操作应用的窗口元素信息,这有可能给你带来隐私信息的泄露风险,比如获取非密码输入框的输入内容等。同时通过辅助功能也可以模拟用户自动化点击应用内元素,也会带来一定的安全风险。
本文实现了一种通过系统辅助服务完成应用的自动安装、卸载、强行停止的功能。
1、AndroidManifest.xml文件配置自己实现的MyAccessibilityService服务。
2、在res/xml/phone_accessibility.xml配置相应的参数信息。
3、MainActivity实现安装、卸载、强行停止动作的发起。
4、MyAccessibilityService中通过自动化点击实现应用安装、卸载、强行停止功能。
随着Android版本的不断升级,Android Accessibility功能也越来越强大,Android 4.0版本以前,系统辅助服务功能比较单一,仅仅能过单向获取窗口元素信息,比如获取输入框用户输入内容。到Android 4.1版本以后,系统辅助服务增加了与窗口元素的双向交互,此时可以通过辅助功能服务操作窗口元素,比如点击按钮等。
由于系统辅助服务能够实时获取您当前操作应用的窗口元素信息,这有可能给你带来隐私信息的泄露风险,比如获取非密码输入框的输入内容等。同时通过辅助功能也可以模拟用户自动化点击应用内元素,也会带来一定的安全风险。
本文实现了一种通过系统辅助服务完成应用的自动安装、卸载、强行停止的功能。
1、AndroidManifest.xml文件配置自己实现的MyAccessibilityService服务。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jack.accessibility" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.jack.accessibility.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:label="@string/acc_service_name" android:name=".MyAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/phone_accessibility" /> </service> </application> </manifest>
2、在res/xml/phone_accessibility.xml配置相应的参数信息。
<?xml version="1.0" encoding="utf-8"?> <accessibility-service android:description="@string/accessibility_service_description" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:notificationTimeout="100" android:accessibilityFlags="" android:canRetrieveWindowContent="true" xmlns:android="http://schemas.android.com/apk/res/android" />
3、MainActivity实现安装、卸载、强行停止动作的发起。
package com.jack.accessibility; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.Settings; import android.view.View; import android.app.Activity; import android.content.Intent; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.findViewById(R.id.activeButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent killIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(killIntent); } }); this.findViewById(R.id.installButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub MyAccessibilityService.INVOKE_TYPE = MyAccessibilityService.TYPE_INSTALL_APP; String fileName = Environment.getExternalStorageDirectory() + "/test.apk"; File installFile = new File(fileName); if(installFile.exists()){ installFile.delete(); } try { installFile.createNewFile(); FileOutputStream out = new FileOutputStream(installFile); byte[] buffer = new byte[512]; InputStream in = MainActivity.this.getAssets().open("test.apk"); int count; while((count= in.read(buffer))!=-1){ out.write(buffer, 0, count); } in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive"); startActivity(intent); } }); this.findViewById(R.id.uninstallButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub MyAccessibilityService.INVOKE_TYPE = MyAccessibilityService.TYPE_UNINSTALL_APP; Uri packageURI = Uri.parse("package:com.example.test"); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); startActivity(uninstallIntent); } }); this.findViewById(R.id.killAppButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub MyAccessibilityService.INVOKE_TYPE = MyAccessibilityService.TYPE_KILL_APP; Intent killIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri packageURI = Uri.parse("package:com.example.test"); killIntent.setData(packageURI); startActivity(killIntent); } }); } }
4、MyAccessibilityService中通过自动化点击实现应用安装、卸载、强行停止功能。
package com.jack.accessibility; import java.util.List; import android.accessibilityservice.AccessibilityService; import android.annotation.SuppressLint; import android.util.Log; import android.view.KeyEvent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @SuppressLint("NewApi") public class MyAccessibilityService extends AccessibilityService { public static int INVOKE_TYPE = 0; public static final int TYPE_KILL_APP = 1; public static final int TYPE_INSTALL_APP = 2; public static final int TYPE_UNINSTALL_APP = 3; public static void reset(){ INVOKE_TYPE = 0; } @Override public void onAccessibilityEvent(AccessibilityEvent event) { // TODO Auto-generated method stub this.processAccessibilityEnvent(event); } private void processAccessibilityEnvent(AccessibilityEvent event) { Log.d("test", event.eventTypeToString(event.getEventType())); if (event.getSource() == null) { Log.d("test", "the source = null"); } else { Log.d("test", "event = " + event.toString()); switch (INVOKE_TYPE) { case TYPE_KILL_APP: processKillApplication(event); break; case TYPE_INSTALL_APP: processinstallApplication(event); break; case TYPE_UNINSTALL_APP: processUninstallApplication(event); break; default: break; } } } @Override protected boolean onKeyEvent(KeyEvent event) { // TODO Auto-generated method stub return true; } @Override public void onInterrupt() { // TODO Auto-generated method stub } private void processUninstallApplication(AccessibilityEvent event) { if (event.getSource() != null) { if (event.getPackageName().equals("com.android.packageinstaller")) { List<AccessibilityNodeInfo> ok_nodes = event.getSource().findAccessibilityNodeInfosByText("确定"); if (ok_nodes!=null && !ok_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<ok_nodes.size(); i++){ node = ok_nodes.get(i); if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } } } } private void processinstallApplication(AccessibilityEvent event) { if (event.getSource() != null) { if (event.getPackageName().equals("com.android.packageinstaller")) { List<AccessibilityNodeInfo> unintall_nodes = event.getSource().findAccessibilityNodeInfosByText("安装"); if (unintall_nodes!=null && !unintall_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<unintall_nodes.size(); i++){ node = unintall_nodes.get(i); if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } List<AccessibilityNodeInfo> next_nodes = event.getSource().findAccessibilityNodeInfosByText("下一步"); if (next_nodes!=null && !next_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<next_nodes.size(); i++){ node = next_nodes.get(i); if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } List<AccessibilityNodeInfo> ok_nodes = event.getSource().findAccessibilityNodeInfosByText("打开"); if (ok_nodes!=null && !ok_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<ok_nodes.size(); i++){ node = ok_nodes.get(i); if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } } } } private void processKillApplication(AccessibilityEvent event) { if (event.getSource() != null) { if (event.getPackageName().equals("com.android.settings")) { List<AccessibilityNodeInfo> stop_nodes = event.getSource().findAccessibilityNodeInfosByText("强行停止"); if (stop_nodes!=null && !stop_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<stop_nodes.size(); i++){ node = stop_nodes.get(i); if (node.getClassName().equals("android.widget.Button")) { if(node.isEnabled()){ node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } } List<AccessibilityNodeInfo> ok_nodes = event.getSource().findAccessibilityNodeInfosByText("确定"); if (ok_nodes!=null && !ok_nodes.isEmpty()) { AccessibilityNodeInfo node; for(int i=0; i<ok_nodes.size(); i++){ node = ok_nodes.get(i); if (node.getClassName().equals("android.widget.Button")) { node.performAction(AccessibilityNodeInfo.ACTION_CLICK); Log.d("action", "click ok"); } } } } } } }
- AccessibilityDemo.zip (2.6 MB)
- 下载次数: 10
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 569本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1029颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 926从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1037Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 903Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 768前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 857监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 733在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 827最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1225##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1000当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 678setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1404问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 682底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1663点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1291import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2200TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1449一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 794Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 889最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
主要介绍了Android Accessibility 辅助功能简单介绍的相关资料,文字转语音,触觉反馈,手势操作,轨迹球和手柄操作,需要的朋友可以参考下
抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件或窗口变化事件来查找红包关键字然后去模拟点击或打开红包。 下面附上源码,程序已实现自动抢红包,锁屏黑屏状态自动...
本项目使用辅助功能AccessibilityService实现Android侧边栏悬浮窗效果.实现的功能包括返回,主页,最近任务,启动某个app,系统音量和亮度调节,开机启动,接收到自定义广播隐藏侧边栏等.本项目适配Android 5.0到Android ...
AndroidSideBar,本项目使用辅助功能 AccessibilityService 实现 Android 侧边栏悬浮窗效果.实现的功能包括返回,主页,最近任务,启动某个 app,系统音量和亮度调节,开机启动,接收到自定义广播隐藏侧边栏等.本项目适配 ...
最终版辅助功能设计,需要用户手动启动辅助功能,才能使用。
使用Android辅助功能AccessibilityService实现微信自动聊天;可对接腾讯云、阿里云智能客服机器人;测试时使用微信版本v8.0.15。
Web和Android的辅助功能见解 从该存储库中构建了两个项目: Accessibility Insights for Web是Google Chrome和新Microsoft Edge的浏览器扩展,用于评估网站和Web应用程序的可访问性。 适用于Android的...
一个(某种功能的)示例,说明如何使用浮动窗口和可访问性服务在 Android 上模拟鼠标以单击视图。 用法 在 Android Studio 中打开项目并在您的设备上运行。 前往“设置”>“辅助功能”并打开“鼠标光标”。 将...
依据Android官方文档,考虑到一些用户不能很好地使用Android设备,比如由于视力、身体、年龄方面的限制,造成阅读内容、触控操作、声音信息等方面的获取困难,因此Android提供了Accessibility特性和服务帮助用户更好...
有关移动辅助功能的更多信息,请参见: : 该库收集对View对象以及AccessibilityNodeInfo对象(Android框架从View派生并发送到AccessibilityServices)的各种与可访问性相关的检查。建立图书馆提供的gradle包装器和...
Float-Bar ...关于辅助功能这个东西网上的说明少的可怜,只能通过看Android官方系统新特性获得,这里说明下如何用系统的辅助功能来实现模拟操作。 1.注册 service必须按照规定注册 这里写上了权限
Android提供了Accessibility(辅助功能/无障碍)更加简单地操作设备, 包括文字转语音、触觉反馈、手势操作、轨迹球和手柄操作等。 在Android 4.0以前,Accessibility功能单一,仅能过单向获取窗口信息(获取输入框内容...
### 第三方WECHAT辅助服务 > #### 基于AccessibilityService实现 > > #### 激活码IMEI码绑定,群组列表群发,好友列表群发,定时自动任务,发送间隔时间设定 > > #### 更新至2.2版本,适配WECHAT7.0.3 > > #### ...
基于Android的监听微信红包+自动抢红包(抢红包必备助手)(利用AccessibilityService这个辅助服务类,监听通知栏微信消息,如果有微信红包,就模拟界面一些控件的点击事件).zip 基于Android的监听微信红包+自动抢...
基于Android的监听微信红包+自动抢红包(抢红包必备助手)(利用AccessibilityService这个辅助服务类,监听通知栏微信消息,如果有微信红包,就模拟界面一些控件的点击事件).zip 基于Android的监听微信红包+自动抢...
利用android sdk14以上版本的AccessibilityService服务,自动获取微信信息框的title,input等ui进行操作,可以实现自动回复,自动发表情,自动抢红包等等功能,当然你要手工在设置中复辅助设置中开启允许此服务启动...
最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下面的示例中会展示一个抢红包的小Demo,附带源码抢红包源码。 二、效果图 在桌面收到红包进行抢 ...
如果APP崩溃过或APP在开启辅助功能的时候进行覆盖安装,大概率会出现辅助功能直接无效的情况(就是"红包锁定中"这句话都出不来),重启手机即可(以后需要注意,这是Android的通病) 由于国内第三方厂商各种奇葩定制...