點擊上方「AirPython」,選擇「置頂公衆號」node
第一時間獲取 Python 及自動化技術乾貨!android
閱讀文本大概須要 10 分鐘。web
1微信
目 標 場 景app
若是你常常須要 發朋友圈,不管是哪裏複製的文案,直接粘貼後到輸入框發送出去,確定會被官方 摺疊 處理,所以,應用市場上出現了不少防摺疊輸入法 App。編輯器
可是這些 APP 要麼收費,要麼體驗差,界面上各類廣告,用起來各類不爽。ide
本篇文章的目的是帶你們利用自動化服務實現朋友圈不折疊這一功能。
ui
ps:若是只想使用這個服務,能夠直接下載文末提供的 APK 。url
2spa
編 寫 代 碼
仔細觀察後發現,只要真實模擬人爲輸入,一個字一個字地輸入字符,就能保證文字不會被官方摺疊,因此這裏選擇使用 無障礙服務 的方案來實現。
不會使用無障礙服務的小夥伴能夠參考下面這篇文章:
第 1 步,編寫配置文件
配置文件包含:應用包名、描述信息、事件類型,用來監聽微信 App 頁面變化事件。
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/desc"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" />
第 2 步,自定義無障礙服務
重寫 onAccessibilityEvent 方法;對接受到的事件進行一次過濾,即:只處理朋友圈發佈界面的事件。
private static final String CLASS_NAME_SNS_UPLOAD = "com.tencent.mm.plugin.sns.ui.SnsUploadUI";
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
//若是是朋友圈發佈界面
String className = event.getClassName().toString();
if (TextUtils.equals(CLASS_NAME_SNS_UPLOAD, className))
{
Log.e("xag", "朋友圈發佈界面");
}
}
經過 Monitor 觀察 UI 樹,發現朋友圈發表界面輸入框的 id 爲:com.tencent.mm:id/d41。
須要注意的是,因爲界面元素 id 常常會變更,爲了增長程序的可適配性,能夠換一種方案:查找元素樹中的第一個 EditText 元素。
接着,咱們經過遍歷拿到當前界面的全部節點元素。
/***
* 獲取當前頁面全部的元素
* @param node
*/
public static void getAllNodes(AccessibilityNodeInfo node)
{
int count = node.getChildCount();
if (count == 0)
{
PreventService.nodes.add(node);
} else
{
for (int i = 0; i < count; i++)
{
getAllNodes(node.getChild(i));
}
}
}
而後,經過類名匹配找到第一個 ClassName 爲 EditText 的節點,即爲頁面內惟一存在的輸入框。
/***
* 經過類名查找元素
* @param className
* @return
*/
public AccessibilityNodeInfo findNodeInfoByClassName(String className)
{
for (int i = 0; i < nodes.size(); i++)
{
//當前節點元素及classname
AccessibilityNodeInfo currentNode = nodes.get(i);
String tagClassName = currentNode.getClassName().toString();
Log.d("xag", "tagClassName:" + tagClassName);
if (TextUtils.equals(tagClassName, className))
{
Log.d("xag", "元素找到了");
return currentNode;
}
}
Log.d("xag", "元素沒找到");
return null;
}
第 3 步,從剪切板內讀取內容
利用上下文系統服務拿到 ClipboardManager 管理器,從剪切板中讀取第一條數據。
/***
* 獲取剪切板上的內容
* @return
*/
public static String getClipBoardContent(Context context)
{
ClipboardManager cm = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
ClipData cd2 = cm.getPrimaryClip();
String result = "";
try
{
result = cd2.getItemAt(0).getText().toString();
} catch (Exception e)
{
//pass
Log.d("xag", "產生異常了。。。。");
}
return result;
}
第 4 步,自動化寫入內容
想要徹底模擬人爲輸入,能夠遍歷上面拿到的內容,一個一個字符的輸入。
/**
* 模擬輸入
*
* @param nodeInfo nodeInfo
* @param text text
*/
public void inputText(AccessibilityNodeInfo nodeInfo, String text)
{
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
Log.d("xag", "字符個數爲:" + text.length());
for (int i = 0; i < text.length(); i++)
{
String temp = text.substring(0, i + 1);
Log.e("xag", "輸入一次,輸入內容是:" + temp);
//輸入內容
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, temp);
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
//下面能夠控制輸入的速度,這裏設置間隔爲0.1s
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
爲了控制字符輸入速度,每一個字符輸入完成以後,能夠 休眠 一段時長。
第 5 步,編寫界面
首次打開應用的時候,默認無障礙服務是關閉的,須要手動去開啓一次。
開啓服務以後,就可使用朋友圈防摺疊服務了。
3
結 果 結 論
經過上面的 5 步操做,就完成了朋友圈的防摺疊服務的開發。
日常使用的時候,只須要開啓防摺疊無障礙服務,複製任務文案,打開朋友圈的發佈界面,服務會自動化完成輸入。
最後須要提醒的是,國內產商對無障礙服務都有作限制,爲了保證服務一直能正常運行,能夠打開允許後臺運行的開關。
我已經將所有源碼,包含編譯後的 APK 上傳到後臺,關注公衆號後回覆「 防摺疊 」便可得到所有源碼。
若是你以爲文章還不錯,請你們點贊分享下。你的確定是我最大的鼓勵和支持。
本文分享自微信公衆號 - AirPython(AirPython)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。