本文旨在介绍AccessibilityService假定更高雅的运用,以及运用进程遇到的问题,该怎样处理。

一、介绍

辅佐功用服务在后台工作,并在触发AccessibilityEvent时由体系接收回调。这样的工作表示用户界面中的一些状况转化,例如,焦点现已改动,按钮被denon功放说明书点击等等。现在常用于主动化事务中,例如:denominate信主动抢红包插件,微商主动加邻近好友,主动谈论朋友,点赞朋友圈,甚至运用在群控体系,进行刷单

二、装备

1shell编程、新建Service并承继AccessibilityServicandroid手机e

    /**
* 中心服务:实施主动化任务
* Creatshell脚本ed by behindeandroid是什么手机牌子ye on 2017/6/13.
*/
public class TaskService_ extends AcceapplicationsShellsibilityService{
@Overappreciateride
pubapp装置下载lic void onAccappearessiAPPbilityEvent(AccessibilityEvent event) {
//留神这个办法回调,是在主shell怎样读线程,不要在这儿实施耗时操作
}
@Override
public void onInterrupt() {
}
}

2、并装备AnddenominateroidManifest.xmlShell

    <APPservice
android:name=".service.TaskService"
android:enabled="true"
anshell怎样读droid:exported="trappleidueapplication"
android:label=deno是什么意思"@string/app_name_setting"
android:permissioapplicationn="android.permission.BIND_ACCESSIBAPPILITY_SERVICE">
<intent-filter&denouementgt;
<acAndroidtion android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility"/>
</android体系下载service>

3、在res目录下新建xml文android/yunos件夹,并新建装备文件accessibility.xml

<?xml version="1.denominate是什么牌子0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/andrdenon功放说明书oid"
<!--监督的动作-->
aAPPndroid:accessibilityandroid studio大局搜索EventTypes="tydenouementpeAllMask"
<!--供给反应类型,语音颤抖等等。-->
android:accessibilityFeedbackType="androidstudio装置教程feedbackGeneric"
<!--监督的view的状况,留androidstudio下载心这儿设置flagDefault会到时分部分界面状况改动,不触发onAccessibilityEvent(AccessibilityEvent evenapplet)的回调-->
android:accessibilityFlags="flagDefaulAndroidt|flagRetrieveInteractiveWindows|flagIncludeNotImportantViewdenos|flagReportdenoViewIds|flagRequestTouchExploratandroid studio快捷键ionModeandroid体系"
<!--是否要可以检索活动窗口的内容,此设置不能在工作时改动-->
android:canRetrieveWindowContenAndroidt="tandroid下载rue"
<!--功用描绘-->
android:description="@string/description"
<!--同一工作间隔时间名-->
android:notificationTimeout="1androidstudio下载00"
&landroid studio导入项目t;!--监控的软件包名-->
android:packaandroid的drawable类geNames="comandroid下载软件app.tencent.mm,com.eg.android.deno是什么意思AlipayGphone" />

三、中心办法

1、根据界面text找到对应的组件(注:办法回来的是集结,找到的组件纷歧点仅有,一同这儿的text不单单是我们理解的 TexapprovetView 的appstore Text,还包括一些组android studio快捷键件的 ContentDescription)

accessibilityNodeInfo.finddenon是什么品牌AccessibilityNodeInfosByText(text)

2、根据组件 id 找到对应的组件(注:办法回来的是集结,找到的组件纷歧点仅有,组件的 id 获取能android体系够经过 Android Studio 内置的东西 monitor 获取,该东西途径:C:UsersDellAppDataLocalAndroidSdktools)

accessibiandroid平板电脑价格lityNodeInfo.findAccessibilityNodeIndenotefosByViewId(id)

四、辅佐权限判别是否翻开

    public static booleadenon hasServicePermission(Context ct, Class serviceClass) {
int ok = 0;
try {
ok = Settings.Sdenon音响ecure.getInt(ct.getContentResolver(), Settings.Secure.ShellACCESSIBILITY_ENABLED);
} catch (Setapproachtings.SettingNoandroid studio快捷键tFoundException e) {
}
TextUtils.SimpleStringSplitter ms = new TextUtils.SimpleStringSplitterandroid下载(':');
if (ok == 1) {
Stdenominatering settingValue = Settings.Secure.getString(ctdenominate是什么牌子.getContentResolver(), Settings.Secure.ENABLED_ACCapproveESSIBILITY_SERVICES);
if (settingValue != null) {
ms.setString(settingValandroid体系ue);
while (ms.hasNext()) {
String acdenominatecessibilityService = ms.next();
if (accessibilityServiceshelly-lan.containsandroid下载软件app(serviceClass.getSimpleName())) {
randroidstudio用什么言语eturn true;
}
}
}
}
return false;
}

五、辅佐的翻开办法

1.root 授权环境下,无需引导用户到体系设置页面翻开

    public static void openServicePermissonRoot(Context ct, Class service) {
String cmd1 = "settings put secure enabled_accessibility_services  " + ct.getPackageName() + "/" + service.getName();
String cmd2 = "settings put secure accessibility_enabled 1";
String[] cmds = new Strishell怎样读ng[]{cmd1, cmd2};
ShellUtils.execCmd(cmds, true);
}

2Android+Studio.targetSdk 版别小于23的状况下,部分手机也可经过以下代码翻开权限,为了兼容,最好 try…catch 以下反常

    public static void openServicePermission(Context ct, Class serviceClass) {
Set&appleidlt;ComponentNashelly-lanme> enabledServices = getEnabledServicesFromSettings(android手机ct, serviceClass);
if (null == enabledServices) {
rAPPeturn;
}
ComponentName toggledService = ComponentName.unflattenFromString(ct.getPackageName() + "/" + serviceClass.getName());
final boolean accessibilityEnabled = true;
enaShellbledServices.add(toggledService);
// Update the enabled services setting.
StringBuilder enabledServicesBuilder =android studio打包apk ndenominate是什么牌子ew StringBuandroidstudio装置教程ilder();
fodenominate是什么牌子r (ComponentName edenotenabledService : enabledServices) {
enabledServicesBuilder.append(enabledService.flattenandroid的drawable类ToString());
enabledServicesBuildeShellr.append(":");
}
final int enabledServicesBuilderLength = enabledServicesBuilder.android平板电脑价格ldenon是什么品牌功放机ength();
if (enabledServicesBuildedenouementrLength > 0) {
enabledServicesBuilder.deleteCharAt(enabledServicesBuilderLengtandroid的drawable类h - 1);
}
Settings.Secure.putStapproachring(ct.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enablshell脚本根本命令edSappleervicesBuilder.android studio导入项目toString());
// Update acceshell脚本ssibilitydenounce enabled.
Settings.SecurAPPe.putInt(ct.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1 : 0)appstore;
}
public static Set<ComponentName> getEnabledServicesFromSettings(Context context, Class serviceClass) {
String enabledServicesSetting = Settidenotengs.Secure.getString(context.getContentResolver(), Settings.denoSecure.ENABLED_ACCandroidstudio装置教程ESSIBIdenon是什么品牌功放机LITY_Sandroidstudio官网ERVICES);
if (edenominatenabledServicesSAndroid+Studioettingappear == null) {
enabledServicesSetting = "";
}
Set<ComponentName> enabledServices = new HashSet<shelly-lanComponentName>();
TextUtils.SimpleStringSplitter colonSplitter = new Tandroid/yunosextUtils.SimpleStringappearanceSplitter(':');
colonSplitter.setString(enabledSerandroid下载软件appvicesSetting);
while (colonSplitter.hasNext()) {
Stringappear componentNameString = colonSplitter.next();
Compondenominate是什么牌子entName enabledService = ComponentName.unflaandroid studio导入项目ttenAndroid+StudioFromString(componentNameString);
if (enabledService != null) {
if (enabledService.flattenToString().contains(serviceClass.getSimpleName())) {
return null;
}
enabledServices.add(enabledService);
}
}
return enabledServicesandroid studio打包apk;
}

3.引导用户到体系设置界面翻开权限

    public static void juapproachmpSystemSetting(Context ct) {
// jump to setting permission
Intent intent = new Intent(Settings.ACTION_ACapproveCESSIBILITY_SETTINGS);
intent.addFlags(Inteandroid什么意思nt.FLAG_ACTIapproachVITY_NEW_TASK);
ct.startActivity(intent);
}

4.结合一同,我们可以这样翻开辅佐权限

    public static vshelly-lanoid openServicePermissonCompat(final Context ct, final Class service) {
//辅佐权限:假定root,android studio快捷键先请求root权限
if (isApapplicationpRoot()) {
if (!hasServicePermission(ct, service)) {
new Thread(new Runnandroid/yunosable() {
@Overrshell是啥意思ide
public void run() {
openServshell脚本根本命令icePermissonRoot(ct, service);
}
}).start();
}
} else {
try {
openServicePermissioshell编程n(ct,Android+Studio service);
} catch (Exception e) {
e.printStackTrace()android手机;
if (!hasSeappleidrvicePermission(ct, service)) {
jumpSystemSetting(ct);
}
}
}
}