AccessibilityService實(shí)現(xiàn)微信發(fā)紅包功能
在AccessibilityService中我們可以做模擬操作,下面記述下通過AccessibilityService實(shí)現(xiàn)微信發(fā)紅包的功能
1.配置AccessibilityService,需要通過集成AccessibilityService來執(zhí)行操作。
public class TestAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { ... } @Override public void onInterrupt() { VirtualControlManager.getInstance().onCancel(); } }
使用時(shí),需要在AndroidManifest.xml進(jìn)行配置
<service android:name=".TestAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:label="@string/accessibility_service_label"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service>
在res文件夾下創(chuàng)建xml文件夾,存放accessibility_service_config.xml
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews" android:canRetrieveWindowContent="true" android:description="@string/accessibility_service_description" android:notificationTimeout="100"/> <!--accessibilityEventTypes:表示該服務(wù)對界面中的哪些變化感興趣,即哪些事件通知,比如窗口打開,滑動, 焦點(diǎn)變化,長按等.具體的值可以在AccessibilityEvent類中查到,如typeAllMask表示接受所有的事件通知.--> <!--accessibilityFeedbackType:表示反饋方式,比如是語音播放,還是震動--> <!--canRetrieveWindowContent:表示該服務(wù)能否訪問活動窗口中的內(nèi)容.也就是如果你希望在服務(wù)中獲取窗體內(nèi)容的化,則需要設(shè)置其值為true.--> <!--notificationTimeout:接受事件的時(shí)間間隔,通常將其設(shè)置為100即可.--> <!--packageNames:表示對該服務(wù)是用來監(jiān)聽哪個(gè)包的產(chǎn)生的事件-->
這句話非常重要,后面會用到,切記
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
2.啟動微信
Intent intent = new Intent(Intent.ACTION_MAIN); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent // .FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //加這個(gè)flag為了讓微信能夠進(jìn)入的時(shí)候在會話列表 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName(“com.tencent.mm”, “com.tencent.mm.ui.LauncherUI”); intent.setComponent(cn); context.startActivity(intent);
網(wǎng)上很多啟動微信的代碼在setFlags中的參數(shù)都是我注釋的那段,用那段確實(shí)可以啟動微信,但是不能保證微信啟動后就是最原始的消息列表,而是微信任何界面(用戶上次操作微信停留的界面),這樣在想做模擬點(diǎn)擊的操作,要加好多的判斷界面的代碼和操作,那么能否我啟動微信時(shí)一定在消息列表呢,答案是可以的,那就是用下面這個(gè)flag,在啟動微信的時(shí)候肯定會到消息列表,省去了我們的操作。
Intent.FLAG_ACTIVITY_CLEAR_TOP
3.執(zhí)行操作
通過AccessibilityService的onAccessibilityEvent(...)方法,我們可以獲取到界面view的信息,用getRootInActiveWindow(),一步步通過view的id,來模擬操作,到發(fā)紅包界面。
這里需要注意,微信在跳轉(zhuǎn)到紅包界面的時(shí)候是有一個(gè)dialog加載動畫的,不少人在跳轉(zhuǎn)到發(fā)紅包界面時(shí),通過getRootInActiveWindow()獲取到的對象不是null就是節(jié)點(diǎn)信息不對,這是因?yàn)橐粋€(gè)dialog快速加載過去了,部分機(jī)器能看一閃的效果,如果手機(jī)性能比較好,這個(gè)dialog可能就看不到,但是代碼執(zhí)行的時(shí)候就拿不到節(jié)點(diǎn)信息。
嘗試過加延時(shí),但是延時(shí)過后,onAccessibilityEvent方法不執(zhí)行,還是等于沒有。
這時(shí)候就需要用到開篇講的了這段代碼了:
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
加上這段代碼后,我們就能通過onAccessibilityEvent來獲取到發(fā)紅包界面的view了,發(fā)一段在發(fā)紅包界面填寫金額的代碼:
private void sendLuckMoney() { AccessibilityNodeInfo rootInfo = accessibilityService.getRootInActiveWindow(); if (rootInfo != null) { List<AccessibilityNodeInfo> nodeInfoList = rootInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/clu"); for (AccessibilityNodeInfo nodeInfo : nodeInfoList) { Bundle arguments = new Bundle(); arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "10"); nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android EditText追加空格、限制字符等方法示例
這篇文章主要給大家介紹了關(guān)于Android EditText追加空格、限制字符等的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06android webview 中l(wèi)ocalStorage無效的解決方法
這篇文章主要介紹了android webview 中l(wèi)ocalStorage無效的解決方法,本文直接給出解決方法實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06Android使用post方式上傳圖片到服務(wù)器的方法
這篇文章主要介紹了Android使用post方式上傳圖片到服務(wù)器的方法,結(jié)合實(shí)例形式分析了Android文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2016-03-03Android ExpandableListView長按事件的完美解決辦法
本篇文章是對Android中ExpandableListView長按事件的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android?Jetpack庫重要組件WorkManager的使用
WorkManager是Android?Jetpack的一個(gè)強(qiáng)大的組件,用于處理后臺耗時(shí)任務(wù)。后臺任務(wù)可以是一次性的,也可以是重復(fù)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android 退出多Activity的application的方式方法
在開發(fā)過程中,我們常常需要一個(gè)退出功能,來退出該應(yīng)用的所有Activity,本篇文章主要介紹了Android 退出多Activity的application的方式,有興趣的可以了解一下。2017-02-02Android實(shí)現(xiàn)手勢滑動多點(diǎn)觸摸放大縮小圖片效果
這篇文章主要介紹了Android實(shí)現(xiàn)手勢滑動多點(diǎn)觸摸放大縮小圖片效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02