分析Android 搜狗輸入法在微信和QQ中傳送圖片和表情

瘋震震發表於2017-12-17

好記性不如爛筆頭。生活中多做筆記,不僅可以方便自己,還可以方便他人。

背景

有沒有發現,有時候表情或圖片的交流更能讓氣氛更愉悅。鬥圖,成了群裡的日常小事,然而,當你沒有圖可斗的時候就尷尬了。最近,搜狗輸入法提供了非常強大的各種鬥圖大全,這可不得了了,只要輸入法你希望表達的意思的文字,就能搜到到相應意思的表情,這功能非常有意思。 最近,老大要我研究一下搜狗輸入法是如何直接在微信和QQ上發圖片和表情的。作為“”開發汪”,面對新的東西,內心是“”雞凍”澎湃的,立馬拍拍胸口“包在我身上”。

正文

1. 微信

二話不說,我先是google,百度了一番,結果什麼有用的相關資訊都沒找到,因為輸入法開發本來就非常少。於是開始猜測是通過微信SDK分享的,查閱了開發文件,確實,微信有分享圖片和表情包的SDK。於是,我註冊了一個開發者賬號,等了幾天,終於稽核通過了。

然鵝,通過微信SDK分享的途徑,雖然能分享,但是都必須跳轉到選擇好友介面,而不是直接在好友介面傳送圖片或表情。於是,我繼續查閱,看看能否有方法繞過微信的SDK分享,然後,在CSDN上找到了這個:

//分享圖片給朋友(不用微信sdk)  
    private void shareToFriend(Uri u){  
        Intent intent = new Intent();  
        ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");  
        intent.setComponent(comp);  
        intent.setAction(Intent.ACTION_SEND);  
        intent.setType("image/*");  
        intent.putExtra(Intent.EXTRA_STREAM, u);  
        startActivity(intent);  
    } 
複製程式碼

沒錯,通過這種方法,確實可以繞過微信的SDK,但是這種方法還是會跳轉到選擇好友介面。沒辦法,只好去反編譯搜狗輸入法apk來看看了。

從搜狗輸入法在非微信介面分享圖片的途徑來看,應該是使用了微信的SDK分享的,於是反編譯搜狗輸入法後,通過關鍵字 WXEmojiobject 搜尋,發現了下面:

image.png

結合上面程式碼截圖來分析一下。通過程式碼上的註釋 “。。。=====commit git expression in weixin =====。。。”,我可以肯定,我找到傳送圖片和表情的程式碼了。從程式碼的後半部分“ImediaObject wXEmojiObject。。。。。”來看,後半部分應該是在非微信介面的分享,使用的是微信的SDK。還有從前面的微信的包名: com.tencent.mm 也可以看出來 if 條件裡面的就是微信聊天介面分享表情的程式碼,通過“IS_CHAT_EDITOR”可以判斷是否是微信聊天介面,這個應該是跟微信約定好的。

好了,我們再來分析一下,從if裡面內容來看,這裡最終做了一個操作 a2.commitText(charSequence, 1) ,這個操作就是輸入法用來提交文字的,也就是說搜狗輸入法把一串文字提交到輸入框,然後就傳送了圖片或表情。什麼鬼?輸入一串文字就能傳送圖片了?

還有一個細節,我確實忽略了。在我們傳送表情或圖片時,微信的編輯框上會閃現一串文字,沒錯,正是搜狗輸入法提交到編輯框的那串文字。因為是閃現的,所以我們看不清,不以為然,我錄屏截圖看看:

image.png

恍然大悟,原來搜狗輸入法這是把表情或圖片的路徑提交到編輯框,然後微信的編輯框自動就會幫你識別該圖片。不信的話,可以試試在手機根目錄下放一張圖片,把路徑貼上到微信的聊天編輯框,它會馬上識別到圖片,然後讓你點選確定傳送的。

原來最強大的是微信的編輯框,可以識別文字路徑下的圖片。好了,真想大白了,如果你做的是輸入法開發,那你也可以這樣直接發表情和圖片了。

搜狗輸入法的表情包分為本地的和線上的,本地的可以通過傳送路徑,那線上的呢?這還不簡單,把線上的下載到本地不就行了嗎,表情非常小,所以下載也很快。我順便發一下搜狗輸入法的表情包儲存位置吧:

1. 搜狗輸入法本地表情包存放在"/storage/emulated/0/sogou/.expression/ ".
2. 網路表情包下載並儲存到"/storage/emulated/0/Android/data/com.sohu.inputmethod.sogou/files/flx/net_images/ ".
複製程式碼

目前是這樣,不知道將來會不會改,你可以到這裡面去看,裡面儲存了很多表情。

2. QQ

如法炮製,我也按照微信的套路,找找QQ聊天介面搜狗輸入法是如何直接傳送圖片和表情的,在反編譯的程式碼中,我也找到了相應的方法:

image.png

從程式碼上可以確定,程式碼我是找對了。 那我來分析一下吧。從程式碼主體上看,主要做了一件事,搜狗輸入法向編輯框傳送了一條私有命令 a2.performPrivateCommand("com.sogou,inputmethod.expression", bundle2); 其中的performPrivateCommand方法是InputConnection類的一個方法,是輸入法用於向所連線的編輯框傳送私有命令。傳送的命令裡面攜帶了一個bundle,bundle裡面攜帶了圖片或表情的路徑,相應的key是“SOUGOU_EXP_PATH”。

所以,很顯然,這是搜狗輸入法跟QQ約定好的一個操作。我簡單的嘗試了一下,也通過傳送這條命令,但是沒有成功,那就不知道QQ裡都幹啥了。

結尾

好了,寫到這裡也差不多完了。東西雖然挺簡單的,但還是寫了出來,畢竟這也是自己的一次探索經歷,畢竟,我是把這當筆記來寫了。如有不服,歡迎來“搞”!哈哈哈!

相關文章