对于那些由于视力、听力或其它身体原因导致不能方便使用android智能手机的用户,android提供了accessibility 功能 和服务帮助这些用户更加简单地操作设备,包括文字转语音、触觉反
对于那些由于视力、听力或其它身体原因导致不能方便使用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实现安装、卸载、强行停止动作的发起。
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 ok_nodes = event.getsource().findaccessibilitynodeinfosbytext(确定); if (ok_nodes!=null && !ok_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i unintall_nodes = event.getsource().findaccessibilitynodeinfosbytext(安装); if (unintall_nodes!=null && !unintall_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i next_nodes = event.getsource().findaccessibilitynodeinfosbytext(下一步); if (next_nodes!=null && !next_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i ok_nodes = event.getsource().findaccessibilitynodeinfosbytext(打开); if (ok_nodes!=null && !ok_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i stop_nodes = event.getsource().findaccessibilitynodeinfosbytext(强行停止); if (stop_nodes!=null && !stop_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i ok_nodes = event.getsource().findaccessibilitynodeinfosbytext(确定); if (ok_nodes!=null && !ok_nodes.isempty()) { accessibilitynodeinfo node; for(int i=0; i
完整demo下载地址:http://download.csdn.net/detail/jiazhijun/8251277