Accessibility Service - 자동 으로 좋아요 누 르 기 기능 구현
15098 단어 Android안 드 로 이 드 진급 학습 노트
Accessibility Service 체 제 를 이용 하여 비교적 재 미 있 는 기능 을 실현 하 였 으 며, 위 챗 모멘트 는 자동 으로 '좋아요' 를 누 르 고 있다.끊 임 없 는 스크롤 + 좋아요 누 르 기 를 통 해 모든 친구 들 을 한 번 씩 칭찬 하 는 것 이다.
물론 그 중에서 판단 알고리즘 도 언급 해 야 한다. 예 를 들 어 이 친구 권 이 이미 칭찬 을 받 았 다 면 뛰 어 넘 고 현재 화면 에 칭찬 할 만 한 친구 권 이 없 을 때 페이지 를 넘 기 는 것 이다.사실 시행 착 오 는 매우 번 거 로 운 과정 으로 이 효과 도 이틀 정도 차이 가 나 지 않 는 다.
사용 방법:
실행 프로그램 - 무장 애 서 비 스 를 시작 하고 위 챗 메 인 인터페이스 로 전환 하여 친구 권 에 들 어가 면 자동 으로 좋아요 프로그램 을 실행 합 니 다.
효과 도 는 다음 과 같다.
실현 원리 절차 및 난점:
1. 먼저 위 챗 모멘트 라 는 인터페이스의 ListView 결점 을 얻 거나 루트 노드 설명 을 통 해 이 인터페이스 에 들 어 갈 지 여 부 를 판단 해 야 합 니 다.
2. 모멘트 인터페이스 에 도착 하면 프로그램 방법 체 를 실행 할 수 있 지만 boolean 값 판단 이 있어 야 한 번 만 실행 할 수 있 습 니 다.
왜 이 방법 체 는 한 번 만 실행 할 수 있 습 니까?(코드 는 아래 에 있 습 니 다) 만약 에 수 동적 으로 onAccessibility Event 에 우리 의 방법 을 호출 시 키 면 많은 문제 가 발생 할 수 있 습 니 다. 예 를 들 어 결산 점 이 너무 빨리 갱신 되 고 여러 번 의 트리거 방법 으로 인해 좋아요 단 계 를 동시에 N 번 실행 한 다음 에 무한 사 순환 을 합 니 다. onAccessibility Event 의 트리거 가 너무 빨 라 서 약 0. 몇 밀리초 에 한 번 촉발 되 기 때문에 저 는 마지막 으로 방법론 을 한 번 만 촉발 시 켰 습 니 다.1 초 에 한 번 씩 휴면 하면 결점 을 갱신 할 시간 이 충분 하고 집행 의 안정성 도 확보 할 수 있다.
3. 사용자 의 이름 을 기록 합 니 다. 예 를 들 어 제 이름 은 '진 나라 까지 의 참외' 입 니 다. 그리고 저 는 아래 의 모든 아 이 템 의 결산 점 에서 좋아요 구역 을 찾 은 다음 에 '진 나라 까지 의 참외' 라 는 필드 가 있 는 지 찾 습 니 다. 어떤 것 은 이 친구 들 이 이미 찬 사 를 했 고 뛰 어 넘 었 으 며 없 으 면 좋아요 가 실 행 됩 니 다.
3. 좋아요 프로그램의 실행 은 어렵 지 않 습 니 다. 코드 를 알 아 볼 수 있 고 여 기 는 지나 갑 니 다.
코드 구현:
/**
* Created by jiangzn on 17/2/6.
*/
public class MyAccessibilityService extends AccessibilityService {
@Override
protected void onServiceConnected() {
LogUtils.d("onServiceConnected");
}
String description;
ArrayList topList = new ArrayList<>();
List lvs;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
try {
// UI ,
AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow();
if (rootNodeInfo == null) {
return;
}
description = "";
if (rootNodeInfo.getContentDescription() != null) {
description = rootNodeInfo.getContentDescription().toString();
}
//
if (mUserName.equals("")) {
//Lv
lvs = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cn0");
LogUtils.d(" Lv : " + lvs.size());
// size 0, ,
if (lvs.size() != 0) {
//1.
List userNames =
rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/afa");
if (userNames.size() != 0) {
if (userNames.get(0).getParent() != null && userNames.get(0).getParent().getChildCount() == 4) {
mUserName = userNames.get(0).getText().toString();
if (!mUserName.equals("") && !ifOnce) {
LogUtils.d(" , ");
LogUtils.d(" :" + mUserName);
ifOnce = true;
//
test3(rootNodeInfo);
}
}
}
} else {
ifOnce = false;
mUserName = "";
}
}
} catch (Exception e) {
if (e != null && e.getMessage() != null) {
LogUtils.d(" :" + e.getMessage().toString());
}
}
}
String mUserName = "";
private boolean ifOnce = false;
/**
* com.tencent.mm:id/cn0
* ( )
* :com.tencent.mm:id/afa
* : id:com.tencent.mm:id/cnn
* 【 】, ID。
* ,
* Id
*
* @param rootNodeInfo
*/
private synchronized void test3(AccessibilityNodeInfo rootNodeInfo) {
LogUtils.d(" :" + Thread.currentThread());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
topList.clear();
if (!mUserName.equals("")) {
// ,
List fuBtns =
rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/co0");
LogUtils.d("fuBtns :" + fuBtns.size());
if (fuBtns.size() != 0) {
// fuBtn
AccessibilityNodeInfo lastFuBtn = fuBtns.get(fuBtns.size() - 1);
Rect lastFuBtnOutBound = new Rect();
lastFuBtn.getBoundsInScreen(lastFuBtnOutBound);
if (lastFuBtnOutBound.top > Config.height) {
fuBtns.remove(lastFuBtn);
}
for (int i = 0; i < fuBtns.size(); i++) {
AccessibilityNodeInfo fuBtn = fuBtns.get(i);
LogUtils.d("fuBtn :" + fuBtn.getChildCount());//3-4
List plBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj9");
LogUtils.d(" :" + plBtns.size());
if (plBtns.size() == 0) {
if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
test3(getRootInActiveWindow());
}
return;
}
AccessibilityNodeInfo plbtn = plBtns.get(0); //
List zanBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cnn");
LogUtils.d(" :" + zanBtns.size());
if (zanBtns.size() != 0) {
//2. , , ,
AccessibilityNodeInfo zanbtn = zanBtns.get(0);
LogUtils.d(" :" + zanbtn.getText().toString());
if (zanbtn != null && zanbtn.getText() != null &&
zanbtn.getText().toString().contains(mUserName)) {
LogUtils.d("********************* ");
// , ,
boolean ifxuyaofanye = false;
LogUtils.d("O(≧ ≦)O: i=" + i + " fuBtns.size():" + fuBtns.size());
if (i == fuBtns.size() - 1) {
ifxuyaofanye = true;
}
if (ifxuyaofanye) {
//
if (jianceIfLou()) {
LogUtils.d(" !!!! !!!!!!!!!!");
test3(getRootInActiveWindow());
} else {
if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
test3(getRootInActiveWindow());
return;
}
}
}
} else {
LogUtils.d("**************************: !");
//
if (plBtns.size() != 0) {
Rect outBounds = new Rect();
plbtn.getBoundsInScreen(outBounds);
int top = outBounds.top;
// top
if (topList.contains(top)) {
return;
}
//com.tencent.mm:id/cj5
if (plbtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
List zanlBtns = rootNodeInfo.
findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj3");
if (zanlBtns.size() != 0) {
if (!topList.contains(top) && zanlBtns.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
topList.add(top);
LogUtils.d("topList:" + topList.toString());
// , ,
boolean ifxuyaofanye = false;
LogUtils.d("O(≧ ≦)O: i=" + i + " fuBtns.size():" + fuBtns.size());
if (i == fuBtns.size() - 1) {
ifxuyaofanye = true;
}
if (ifxuyaofanye) {
//
if (jianceIfLou()) {
LogUtils.d(" !!!! !!!!!!!!!!");
test3(getRootInActiveWindow());
} else {
if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
test3(getRootInActiveWindow());
return;
}
}
}
}
}
}
}
}
} else {
LogUtils.d("**************************: !plBtns.size() :" + plBtns.size());
//
if (plBtns.size() != 0) {
Rect outBounds = new Rect();
plbtn.getBoundsInScreen(outBounds);
int top = outBounds.top;
// top
if (topList.contains(top)) {
return;
}
//com.tencent.mm:id/cj5
if (plbtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
List zanlBtns = rootNodeInfo.
findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cj3");
if (zanlBtns.size() != 0) {
if (!topList.contains(top) && zanlBtns.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK)) {
topList.add(top);
LogUtils.d("topList:" + topList.toString());
// , ,
boolean ifxuyaofanye = false;
LogUtils.d("O(≧ ≦)O: i=" + i + " fuBtns.size():" + fuBtns.size());
if (i == fuBtns.size() - 1) {
ifxuyaofanye = true;
}
if (ifxuyaofanye) {
//
if (jianceIfLou()) {
LogUtils.d(" !!!! !!!!!!!!!!");
test3(getRootInActiveWindow());
} else {
if (lvs.get(0).performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
test3(getRootInActiveWindow());
return;
}
}
}
}
}
}
}
}
}
}
}
}
private boolean jianceIfLou() {
boolean result = false;
List fuBtns =
getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/co0");
LogUtils.d(" :" + fuBtns.size());
if (fuBtns.size() != 0) {
for (AccessibilityNodeInfo fuBtn : fuBtns) {
//
List zanBtns = fuBtn.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cnn");
LogUtils.d(" :" + zanBtns.size());
if (zanBtns.size() != 0) {
AccessibilityNodeInfo zanbtn = zanBtns.get(0);
LogUtils.d(" zanbtn.getText().toString():" + zanbtn.getText().toString());
if (zanbtn != null && zanbtn.getText() != null &&
zanbtn.getText().toString().contains(mUserName)) {
result = false;
} else {
result = true;
}
} else {
result = true;
}
}
}
return result;
}
@Override
public void onInterrupt() {
LogUtils.d("onInterrupt");
}
}
보조 서비스 류 의 설정 방법 은 상기 Accessibility Service 를 참고 하여 위 챗 전환 계 정 기능 을 실현 할 수 있 습 니 다.현재 코드 는 두 단락 이 거의 중복 되 어 있 습 니 다. 여 기 는 추출 되 지 않 았 습 니 다. 그 후에 제 가 더 최적화 해 야 하기 때 문 입 니 다. (네, 이것 이 바로 demo 버 전 입 니 다. 고치 고 싶 지 않 습 니 다.)
이렇게 많아
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.