AndroidアクセスbilityServiceによるアナログクリック機能-いくつかのツールクラス(2)
18158 ワード
次回予告:androidアクセスbilityServiceによるアナログクリック機能-onAccessibilityEvent受信イベントの詳細処理(3)
この記事には、私がよく使うツールクラスを添付します.ログツール.(現在のクラス名行番号、クイックロケータコードを印刷) アシストサービスツールクラス.(ノードオブジェクトの取得、スライド、クリック) 遅延、非同期、スリープスレッド 微信工具類
この記事には、私がよく使うツールクラスを添付します.
public class L {
private static String className;//
private static String methodName;//
private static int lineNumber;//
private static boolean isDebug = false;// debug
private L() {
}
public static void setDebug(boolean b) {
isDebug = b;
}
private static boolean isDebuggable() {
// return BuildConfig.DEBUG;
return isDebug;
}
private static String createLog(String log) {
StringBuffer buffer = new StringBuffer();
buffer.append(methodName);
buffer.append("(").append(className).append(":").append(lineNumber).append(")");
buffer.append(log);
return buffer.toString();
}
private static void getMethodNames(StackTraceElement[] sElements) {
className = sElements[1].getFileName();
methodName = sElements[1].getMethodName();
lineNumber = sElements[1].getLineNumber();
}
public static void e(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.e(className, createLog(message));
}
public static void i(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.i(className, createLog(message));
}
public static void d(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.d(className, createLog(message));
}
public static void v(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.v(className, createLog(message));
}
public static void w(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.w(className, createLog(message));
}
public static void wtf(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.wtf(className, createLog(message));
}
}
public class AccessibilityHelper {
private static final String TAG = AccessibilityHelper.class.getSimpleName();
public static AccessibilityService mService;
/**
*
*/
public static boolean isServiceRunning(AccessibilityService service) {
if (service == null) {
return false;
}
AccessibilityManager accessibilityManager = (AccessibilityManager) service.getSystemService(Context.ACCESSIBILITY_SERVICE);
AccessibilityServiceInfo info = service.getServiceInfo();
if (info == null) {
return false;
}
List list = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
Iterator iterator = list.iterator();
boolean isConnect = false;
while (iterator.hasNext()) {
AccessibilityServiceInfo i = iterator.next();
if (i.getId().equals(info.getId())) {
isConnect = true;
break;
}
}
if (!isConnect) {
return false;
}
return true;
}
/**
*
*/
public static void openAccessibilityServiceSettings(Activity context) {
try {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*
* @param event
* @param nodeText
*/
public static void handleEvent(AccessibilityEvent event, String nodeText) {
List unintall_nodes = event.getSource().findAccessibilityNodeInfosByText(nodeText);
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);
}
}
}
}
/**
* text
*/
public static String getNodeText(String id) {
List unintall_nodes = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(id);
if (unintall_nodes != null && !unintall_nodes.isEmpty()) {
return unintall_nodes.get(0).getText().toString().trim();
}
return null;
}
/**
* text
*/
public static String getNodeText(AccessibilityNodeInfo nodeInfo, String id) {
List unintall_nodes = nodeInfo.findAccessibilityNodeInfosByViewId(id);
if (unintall_nodes != null && !unintall_nodes.isEmpty()) {
return unintall_nodes.get(0).getText().toString().trim();
}
return null;
}
private AccessibilityHelper() {
}
// id
public static AccessibilityNodeInfo findNodeInfosById(AccessibilityNodeInfo nodeInfo, String resId) {
if (nodeInfo == null) return null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
List list = nodeInfo.findAccessibilityNodeInfosByViewId(resId);
if (list != null && !list.isEmpty()) {
return list.get(0);
}
}
return null;
}
// id
public static AccessibilityNodeInfo findNodeInfosById(String resId) {
if (mService.getRootInActiveWindow() != null) {
List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId);
if (list != null && !list.isEmpty()) {
return list.get(0);
}
}
return null;
}
// id
public static List findNodeListInfosById(String resId) {
List result = new ArrayList<>();
if (mService.getRootInActiveWindow() != null) {
List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId);
if (list != null) {
result.addAll(list);
}
}
return result;
}
// id , i
public static AccessibilityNodeInfo findNodeInfosById(String resId, int index) {
List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByViewId(resId);
if (list != null && list.size() > index) {
return list.get(index);
}
return null;
}
// node
public static AccessibilityNodeInfo findNodeInfosByIdAndPosition(AccessibilityNodeInfo nodeInfo, String resId, int position) {
if (nodeInfo == null) return null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
List list = nodeInfo.findAccessibilityNodeInfosByViewId(resId);
for (int i = 0; i < list.size(); i++) {
if (i == position) {
return list.get(i);
}
}
}
return null;
}
//
public static AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) {
if (nodeInfo == null) return null;
List list = nodeInfo.findAccessibilityNodeInfosByText(text);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
//
public static AccessibilityNodeInfo findNodeInfosByText(String text) {
if (mService.getRootInActiveWindow() != null) {
List list = mService.getRootInActiveWindow().findAccessibilityNodeInfosByText(text);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
return null;
}
// ClassName
public static AccessibilityNodeInfo findNodeInfosByClassName(AccessibilityNodeInfo nodeInfo, String className) {
if (TextUtils.isEmpty(className)) {
return null;
}
for (int i = 0; nodeInfo != null && i < nodeInfo.getChildCount(); i++) {
AccessibilityNodeInfo node = nodeInfo.getChild(i);
if (node != null) {
if (className.equals(node.getClassName())) {
return node;
} else if (node.getChildCount() > 0) {
findNodeInfosByClassName(node, className);
}
}
}
return null;
}
// ClassName
public static List findNodeInfoListByClassName(AccessibilityNodeInfo nodeInfo, String className) {
if (TextUtils.isEmpty(className)) {
return Collections.EMPTY_LIST;
}
List result = new ArrayList<>();
for (int i = 0; nodeInfo != null && i < nodeInfo.getChildCount(); i++) {
AccessibilityNodeInfo node = nodeInfo.getChild(i);
if (node != null && className.equals(node.getClassName())) {
result.add(node);
}
}
return result;
}
// ClassName
public static AccessibilityNodeInfo findNodeInfosByClassName(String className) {
return findNodeInfosByClassName(mService.getRootInActiveWindow(), className);
}
/**
*
*/
public static AccessibilityNodeInfo findParentNodeInfosByClassName(AccessibilityNodeInfo nodeInfo, String className) {
if (nodeInfo == null) {
return null;
}
if (TextUtils.isEmpty(className)) {
return null;
}
if (className.equals(nodeInfo.getClassName())) {
return nodeInfo;
}
return findParentNodeInfosByClassName(nodeInfo.getParent(), className);
}
private static final Field sSourceNodeField;
static {
Field field = null;
try {
field = AccessibilityNodeInfo.class.getDeclaredField("mSourceNodeId");
field.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
sSourceNodeField = field;
}
public static long getSourceNodeId(AccessibilityNodeInfo nodeInfo) {
if (sSourceNodeField == null) {
return -1;
}
try {
return sSourceNodeField.getLong(nodeInfo);
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
public static String getViewIdResourceName(AccessibilityNodeInfo nodeInfo) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
return nodeInfo.getViewIdResourceName();
}
return null;
}
// HOME
public static void performHome(AccessibilityService service) {
if (service == null) {
return;
}
service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
}
//
public static void performBack(AccessibilityService service) {
if (service == null) {
return;
}
service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
//
public static void performBack() {
// MainService
if (AccessibilityHelper.mService == null) {
return;
}
AccessibilityHelper.mService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
/**
*
*/
public static void performClick(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return;
}
if (nodeInfo.isClickable()) {
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
} else {
performClick(nodeInfo.getParent());
}
}
/**
*
*/
public static void performClick(String id) {
performClick(findNodeInfosById(id));
}
//
public static void performLongClick(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return;
}
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
}
//move
public static void performMoveDown(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return;
}
nodeInfo.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN.getId());
}
//ACTION_SCROLL_FORWARD
public static boolean perform_scroll_forward(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return false;
}
return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
}
//ACTION_SCROLL_BACKWARD
public static boolean perform_scroll_backward(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return false;
}
return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
}
//
@TargetApi(18)
public static void performPaste(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) {
return;
}
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
// editview text
@TargetApi(21)
public static void performSetText(AccessibilityNodeInfo nodeInfo, String text) {
if (nodeInfo == null) {
return;
}
CharSequence className = nodeInfo.getClassName();
if ("android.widget.EditText".equals(className)) {//||"android.widget.TextView".equals(className)
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo
.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
}
}
}
:
compile 'org.jdeferred:jdeferred-android-aar:1.2.4'
public class UiKit {
private static final AndroidDeferredManager gDM = new AndroidDeferredManager();
private static final Handler gUiHandler = new Handler(Looper.getMainLooper());
public static AndroidDeferredManager defer() {
return gDM;
}
public static int dpToPx(Context context, int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}
public static void post(Runnable r) {
gUiHandler.post(r);
}
public static void postDelayed(long delay, Runnable r) {
gUiHandler.postDelayed(r, delay);
}
public static void sleep(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void sleep() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class WeChatHelper {
private WeChatHelper() {
}
private static final WeChatHelper instance = new WeChatHelper();
public static WeChatHelper init() {
return instance;
}
/** */
public static void openWechat(Context context) {
try {
Intent intent = new Intent();
ComponentName cmp = new ComponentName(WechatUI.WECHAT_PACKAGE_NAME, WechatUI.UI_LUANCHER);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(cmp);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
public static int getWechatVersion(Context context) {
PackageInfo mWechatPackageInfo = getPackageInfo(context);
if (mWechatPackageInfo == null) {
return 0;
}
return mWechatPackageInfo.versionCode;
}
/**
*
*/
public static String getWechatVersionName(Context context) {
PackageInfo mWechatPackageInfo = getPackageInfo(context);
if (mWechatPackageInfo == null) {
return "";
}
return mWechatPackageInfo.versionName;
}
/** 7.0.0 */
public static boolean above700() {
return getWechatVersion(LibInstance.getInstance().getTaskListener().provideContext()) >= 1380;
}
/** 6.7.3 */
public static boolean above673() {
return getWechatVersion(LibInstance.getInstance().getTaskListener().provideContext()) >= 1360;
}
/**
*
*/
private static PackageInfo getPackageInfo(Context context) {
PackageInfo mWechatPackageInfo = null;
try {
mWechatPackageInfo = context.getPackageManager().getPackageInfo(WechatUI.WECHAT_PACKAGE_NAME, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return mWechatPackageInfo;
}
}