Android辅助权限的示例分析

这篇文章给大家分享的是有关Android辅助权限的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

成都创新互联公司专注于雨山网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供雨山营销型网站建设,雨山网站制作、雨山网页设计、雨山网站官网定制、小程序开发服务,打造雨山网络公司原创品牌,更为您提供雨山网站排名全网营销落地服务。

一、介绍

辅助功能服务在后台运行,并在触发AccessibilityEvent时由系统接收回调。这样的事件表示用户界面中的一些状态转换,例如,焦点已经改变,按钮被点击等等。现在常用于自动化业务中,例如:微信自动抢红包插件,微商自动加附近好友,自动评论朋友,点赞朋友圈,甚至运用在群控系统,进行刷单。

二、配置

1、新建Service并继承AccessibilityService

/**
  * 核心服务:执行自动化任务
  * Created by czc on 2017/6/13.
  */
 public class TaskService_ extends AccessibilityService{
  @Override
  public void onAccessibilityEvent(AccessibilityEvent event) {
   //注意这个方法回调,是在主线程,不要在这里执行耗时操作
  }
  @Override
  public void onInterrupt() {
 
  }
 }

2、并配置AndroidManifest.xml


  
   
  

  
 

3、在res目录下新建xml文件夹,并新建配置文件accessibility.xml



 android:accessibilityEventTypes="typeAllMask"
 
 android:accessibilityFeedbackType="feedbackGeneric"
  
 android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds|flagRequestTouchExplorationMode"
 
 android:canRetrieveWindowContent="true"
 
 android:description="@string/description"
 
 android:notificationTimeout="100" 
 
 android:packageNames="com.tencent.mm,com.eg.android.AlipayGphone" />

三、核心方法

1、根据界面text找到对应的组件(注:方法返回的是集合,找到的组件不一点唯一,同时这里的text不单单是我们理解的 TextView 的 Text,还包括一些组件的 ContentDescription)

accessibilityNodeInfo.findAccessibilityNodeInfosByText(text)

2、根据组件 id 找到对应的组件(注:方法返回的是集合,找到的组件不一点唯一,组件的 id 获取可以通过 Android Studio 内置的工具 monitor 获取,该工具路径:C:\Users\Dell\AppData\Local\Android\Sdk\tools)

accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id)

使用 Monitor 工具获取节点 id

Android辅助权限的示例分析

Monitor选择id

四、辅助权限判断是否开启

public static boolean hasServicePermission(Context ct, Class serviceClass) {
  int ok = 0;
  try {
   ok = Settings.Secure.getInt(ct.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
  } catch (Settings.SettingNotFoundException e) {
  }

  TextUtils.SimpleStringSplitter ms = new TextUtils.SimpleStringSplitter(':');
  if (ok == 1) {
   String settingValue = Settings.Secure.getString(ct.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
   if (settingValue != null) {
    ms.setString(settingValue);
    while (ms.hasNext()) {
     String accessibilityService = ms.next();
     if (accessibilityService.contains(serviceClass.getSimpleName())) {
      return 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 String[]{cmd1, cmd2};
  ShellUtils.execCmd(cmds, true);
 }

2.targetSdk 版本小于23的情况下,部分手机也可通过以下代码开启权限,为了兼容,最好 try...catch 以下异常

public static void openServicePermission(Context ct, Class serviceClass) {
  Set enabledServices = getEnabledServicesFromSettings(ct, serviceClass);
  if (null == enabledServices) {
   return;
  }
  ComponentName toggledService = ComponentName.unflattenFromString(ct.getPackageName() + "/" + serviceClass.getName());
  final boolean accessibilityEnabled = true;
  enabledServices.add(toggledService);
  // Update the enabled services setting.
  StringBuilder enabledServicesBuilder = new StringBuilder();
  for (ComponentName enabledService : enabledServices) {
   enabledServicesBuilder.append(enabledService.flattenToString());
   enabledServicesBuilder.append(":");
  }
  final int enabledServicesBuilderLength = enabledServicesBuilder.length();
  if (enabledServicesBuilderLength > 0) {
   enabledServicesBuilder.deleteCharAt(enabledServicesBuilderLength - 1);
  }
  Settings.Secure.putString(ct.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServicesBuilder.toString());
  // Update accessibility enabled.
  Settings.Secure.putInt(ct.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1 : 0);
 }

 public static Set getEnabledServicesFromSettings(Context context, Class serviceClass) {
  String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
  if (enabledServicesSetting == null) {
   enabledServicesSetting = "";
  }
  Set enabledServices = new HashSet();
  TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
  colonSplitter.setString(enabledServicesSetting);
  while (colonSplitter.hasNext()) {
   String componentNameString = colonSplitter.next();
   ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);
   if (enabledService != null) {
    if (enabledService.flattenToString().contains(serviceClass.getSimpleName())) {
     return null;
    }
    enabledServices.add(enabledService);
   }
  }
  return enabledServices;
 }

3.引导用户到系统设置界面开启权限

public static void jumpSystemSetting(Context ct) {
  // jump to setting permission
  Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  ct.startActivity(intent);
 }

4.结合一起,我们可以这样开启辅助权限

public static void openServicePermissonCompat(final Context ct, final Class service) {
  //辅助权限:如果root,先申请root权限
  if (isAppRoot()) {
   if (!hasServicePermission(ct, service)) {
    new Thread(new Runnable() {
     @Override
     public void run() {
      openServicePermissonRoot(ct, service);
     }
    }).start();
   }
  } else {
   try {
    openServicePermission(ct, service);
   } catch (Exception e) {
    e.printStackTrace();
    if (!hasServicePermission(ct, service)) {
     jumpSystemSetting(ct);
    }
   }
  }
 }

感谢各位的阅读!关于“Android辅助权限的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


本文标题:Android辅助权限的示例分析
文章链接:http://ybzwz.com/article/pojoih.html