好記性不如爛筆頭。生活中多做筆記,不僅可以方便自己,還可以方便他人。
背景
有沒有發現,有時候表情或圖片的交流更能讓氣氛更愉悅。斗圖,成了群里的日常小事,然而,當你沒有圖可斗的時候就尷尬了。最近,搜狗輸入法提供了非常強大的各種斗圖大全,這可不得了了,只要輸入法你希望表達的意思的文字,就能搜到到相應意思的表情,這功能非常有意思。
最近,老大要我研究一下搜狗輸入法是如何直接在微信和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 搜索,發現了下面:
結合上面代碼截圖來分析一下。通過代碼上的注釋 “。。。=====commit git expression in weixin =====。。?!保铱梢钥隙ǎ艺业桨l送圖片和表情的代碼了。從代碼的后半部分“ImediaObject wXEmojiObject。。。。。”來看,后半部分應該是在非微信界面的分享,使用的是微信的SDK。還有從前面的微信的包名: com.tencent.mm 也可以看出來 if 條件里面的就是微信聊天界面分享表情的代碼,通過“IS_CHAT_EDITOR”可以判斷是否是微信聊天界面,這個應該是跟微信約定好的。
好了,我們再來分析一下,從if里面內容來看,這里最終做了一個操作 a2.commitText(charSequence, 1) ,這個操作就是輸入法用來提交文字的,也就是說搜狗輸入法把一串文字提交到輸入框,然后就發送了圖片或表情。什么鬼?輸入一串文字就能發送圖片了?
還有一個細節,我確實忽略了。在我們發送表情或圖片時,微信的編輯框上會閃現一串文字,沒錯,正是搜狗輸入法提交到編輯框的那串文字。因為是閃現的,所以我們看不清,不以為然,我錄屏截圖看看:
恍然大悟,原來搜狗輸入法這是把表情或圖片的路徑提交到編輯框,然后微信的編輯框自動就會幫你識別該圖片。不信的話,可以試試在手機根目錄下放一張圖片,把路徑粘貼到微信的聊天編輯框,它會馬上識別到圖片,然后讓你點擊確定發送的。
原來最強大的是微信的編輯框,可以識別文字路徑下的圖片。好了,真想大白了,如果你做的是輸入法開發,那你也可以這樣直接發表情和圖片了。
搜狗輸入法的表情包分為本地的和在線的,本地的可以通過發送路徑,那在線的呢?這還不簡單,把在線的下載到本地不就行了嗎,表情非常小,所以下載也很快。我順便發一下搜狗輸入法的表情包保存位置吧:
1. 搜狗輸入法本地表情包存放在"/storage/emulated/0/sogou/.expression/ ".
2. 網絡表情包下載并保存到"/storage/emulated/0/Android/data/com.sohu.inputmethod.sogou/files/flx/net_images/ ".
目前是這樣,不知道將來會不會改,你可以到這里面去看,里面保存了很多表情。
2. QQ
如法炮制,我也按照微信的套路,找找QQ聊天界面搜狗輸入法是如何直接發送圖片和表情的,在反編譯的代碼中,我也找到了相應的方法:
從代碼上可以確定,代碼我是找對了。
那我來分析一下吧。從代碼主體上看,主要做了一件事,搜狗輸入法向編輯框發送了一條私有命令 a2.performPrivateCommand("com.sogou,inputmethod.expression", bundle2); 其中的performPrivateCommand方法是InputConnection類的一個方法,是輸入法用于向所連接的編輯框發送私有命令。發送的命令里面攜帶了一個bundle,bundle里面攜帶了圖片或表情的路徑,相應的key是“SOUGOU_EXP_PATH”。
所以,很顯然,這是搜狗輸入法跟QQ約定好的一個操作。我簡單的嘗試了一下,也通過發送這條命令,但是沒有成功,那就不知道QQ里都干啥了。
結尾
好了,寫到這里也差不多完了。東西雖然挺簡單的,但還是寫了出來,畢竟這也是自己的一次探索經歷,畢竟,我是把這當筆記來寫了。如有不服,歡迎來“搞”!哈哈哈!