最近由于公司的老項(xiàng)目,需要把之前的WPS換成專業(yè)版的WPS,所以開始踩坑金山WPS,確實(shí)有幾個(gè)血坑,在此和大家分享一下:
話不多說,先上金山官方鏈接http://mo.wps.cn/pc-app/office-pro.html
第一步 :打開鏈接往下滑,選擇Android 依次下載下來。

第一個(gè)是官方提供的開發(fā)文檔,
第二個(gè)是使用Demo(兼容eclipse)
第三個(gè)是WPS專業(yè)版的軟件(這個(gè)軟件是收費(fèi)的,但是可以試用一個(gè)月)
打開Demo可以看到以下目錄,這里主要要用到框選中的幾個(gè)package

這里大致介紹一下這幾個(gè)package,
agent:就是提供AIDL通信的,
broad:則是提供一些廣播用來監(jiān)聽手機(jī)的back,home鍵和一些加為他的監(jiān)聽
client:則是打開文件之后的一些操作
util:這個(gè)就沒什么好說的,主要是一些工具類,和常量類
然后我們先把這些package拷貝到自己項(xiàng)目中的一個(gè)package中,然后記得把mainface中的文件也一并拷貝過來,這里主要有兩個(gè)服務(wù)和四個(gè)廣播比較重要
<!--wps start 注冊(cè)的server-->
<service android:name="yh.com.wpstestdemo.openwps.client.MOfficeClientService" >
<intent-filter>
<action android:name="yh.com.wpstestdemo.openwps.client.OfficeServiceClient" />
</intent-filter>
</service>
<service android:name="yh.com.wpstestdemo.openwps.agent.AgentMessageService" >
<intent-filter>
<action android:name="yh.com.wpstestdemo.openwps.agent.OfficeServiceAgent" >
</action>
</intent-filter>
</service>
<!--wps end 注冊(cè)的server-->
<!--wps start 部分操作的廣播-->
<receiver android:name="yh.com.wpstestdemo.openwps.broad.CloseReceiver" >
<intent-filter>
<!--<action android:name="cn.wps.moffice.file.close" /> --> <!-- 該條是就的廣播intent-filter,不推薦使用 -->
<action android:name="cn.wps.moffice.broadcast.AfterClosed" />
</intent-filter>
</receiver>
<receiver android:name="yh.com.wpstestdemo.openwps.broad.SaveReceiver" >
<intent-filter>
<!-- <action android:name="cn.wps.moffice.file.save" />--> <!-- 該條是就的廣播intent-filter,不推薦使用 -->
<action android:name="cn.wps.moffice.broadcast.AfterSaved" />
</intent-filter>
</receiver>
<receiver android:name="yh.com.wpstestdemo.openwps.broad.BackKeyReceiver" >
<intent-filter>
<action android:name="com.kingsoft.writer.back.key.down" />
</intent-filter>
</receiver>
<receiver android:name="yh.com.wpstestdemo.openwps.broad.HomeKeyReceiver" >
<intent-filter>
<action android:name="com.kingsoft.writer.home.key.down" />
</intent-filter>
</receiver>
<!-- end wps 部分操作的廣播-->
AgentMessageService非常重要,是為了提供AIDL通信的,下面這個(gè)OfficeServiceClientImpl其實(shí)就是一個(gè)AIDL中接收器(stub)的實(shí)現(xiàn)類,內(nèi)部初始化了一個(gè)非常重要的監(jiān)聽OfficeEventListenerImpl,如果忘記拷貝這個(gè)package的話,在后續(xù)打開的時(shí)候就會(huì)出現(xiàn)問題

這里我們只需要拷貝到自己的項(xiàng)目中就行了,唯一記住的一點(diǎn)就是在OfficeServiceAgentImpl中 有一個(gè)成員變量JSON_DATA,這個(gè)是實(shí)現(xiàn)多應(yīng)用打開wps的一個(gè)功能,wps默認(rèn)給我提供了一個(gè)通信的key,但是這里我們一般使用自己的包名會(huì)比較好,這里我直接把文檔中的原文粘貼出來

一定記住這兩個(gè)地方不能配置錯(cuò),不然會(huì)收不到打開后的回調(diào),也就不能對(duì)打開的文件做后續(xù)的操作了
這些配置完成之后,再回到demo里面 打開下面這個(gè)類

這個(gè)里面有詳細(xì)的使用規(guī)則,這里我就不多說了代碼如下
public void openFileWps(String fileName,String path){
docPath = path;
File file = new File (path);
if (!file.exists()){
return;
}
if (Util.IsWPSFile(file))
{
//如果是wps能打開的文件,則打開
if (Define.WPS_OPEN_AIDL.equals(settingPreference.getSettingParam(Define.WPS_OPEN_MODE, "")))
{
if (Util.isPDFFile(file.getAbsolutePath())) {
openPDFDoc();
} else if (Util.isPptFile(file.getAbsolutePath())) {
openPresentation();
} else if (Util.isExcelFile(file.getAbsolutePath())) {
openWorkBook();
} else {
openDocument();
}
}
}
else
{//不是wps文件則讓用戶選擇
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String type = Util.getMIMEType(file);
intent.setDataAndType(Uri.fromFile(file), type);
mWeakReference.get().startActivity(intent);
}
}
以上幾個(gè)方法記住一并拷貝過來,到此為止,就可以正常的打開部分文件了,沒錯(cuò),是部分文件,經(jīng)過測(cè)試,PDF的文件打開會(huì)直接崩潰,.PPT文件打開沒問題,但是退出會(huì)學(xué)出現(xiàn)一個(gè)wps軟件異常的問題。(本人覺得這兩個(gè)問題是金山自己的問題,因?yàn)橛盟麄児俜教峁┑膁emo一樣也存在此類問題)
下面我主要介紹一下什么是不落地打開文件,不落地就是說打開文件的時(shí)候,不需要寫到SD卡中,直接通過內(nèi)存中的流或者byte[]來打開,接下來說一下我在使用金山WPS實(shí)現(xiàn)不落地打開文件時(shí)遇到的坑
首先貼出金山提供的不落地方案:

這個(gè)onOpenFile是在OfficeEventListenerImpl類面的,打開文件后會(huì)回調(diào)到onOpenFile(String path, OfficeOutputStream output )我們可以通過這兩個(gè)參數(shù)做相應(yīng)的處理,很明顯,我們?cè)谡{(diào)用openFile的時(shí)候,必須傳給WPS一個(gè)path, 那么這里我的方案是,根據(jù)文件名,在SD卡下創(chuàng)建一個(gè)同名的文件,在onOpenFile()方法里面 根據(jù)path刪除這個(gè)文件,然后把網(wǎng)絡(luò)中的流或者byte[] 通過一個(gè)static的成員變量保存在內(nèi)存中,在onOpenFile()的時(shí)候,通過該方法的第二個(gè)參數(shù)將bytes寫出就完成了不落地方案。
在參照這種模式實(shí)現(xiàn)不落地的時(shí)候,需要注意幾點(diǎn):
1,在Mainface中注冊(cè)服務(wù)和廣播的時(shí)候,一定要注意包名寫全:

如果你是簡(jiǎn)寫的,可能會(huì)出現(xiàn)回調(diào)不回來的問題(本人親自踩坑)
2,在創(chuàng)建同名空文件的時(shí)候,一定要注意,文件名是否進(jìn)行了加密,如果進(jìn)行了加密,那么創(chuàng)建的文件一定要是加密之后的銘文,不然這里會(huì)出現(xiàn)在跳轉(zhuǎn)到wps的時(shí)候,直接崩潰。

這行代碼走完之后,你會(huì)在手機(jī)上看到“暫不支持查看,請(qǐng)期待后續(xù)版本”,看到這里,很容易覺得是wps版本的問題。(這也是WPS的一個(gè)坑)
等所有的問題你都解決完了,你會(huì)發(fā)現(xiàn).doc不落地打開是沒問題的,打開PPT也沒問題,但是關(guān)閉打開的ppt時(shí),但是關(guān)閉了打開的ppt時(shí),又出現(xiàn)了報(bào)錯(cuò):

經(jīng)過測(cè)試,其實(shí)這個(gè)問題跟不落地沒半毛錢的關(guān)系,使用金山的demo也存在這個(gè)問題。
3,當(dāng)你不落地打開.xslx的時(shí)候,又出現(xiàn)了一個(gè)問題:

這個(gè)問題還算是稍微提示得比較明顯,這里需要把文件全部寫到本地,然后也不能在onOpenFile里面進(jìn)行刪除操作,需要在broadcast里面做刪除操作,個(gè)人覺得這里也是比較坑的
4,當(dāng)你打開.txt文件的時(shí)候,不落地打開和本地打開是有區(qū)別的,不落地打開有部分內(nèi)容會(huì)被wpsAPP的titlebar遮擋住,需要手動(dòng)點(diǎn)擊一點(diǎn),才可以看到這個(gè)內(nèi)容效,果如下:
https://s31.aconvert.com/convert/p3r68-cdx67/5p0nw-kwzef.gif 。
以上如有問題,可以直接留言。