快速集成金山WPS專業(yè)版

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

image.png

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

這里大致介紹一下這幾個(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)問題


image.png

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


image.png

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

這些配置完成之后,再回到demo里面 打開下面這個(gè)類


image.png

這個(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í)遇到的坑
首先貼出金山提供的不落地方案:


image.png

這個(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í)候,一定要注意包名寫全:


image.png

如果你是簡(jiǎn)寫的,可能會(huì)出現(xiàn)回調(diào)不回來的問題(本人親自踩坑)

2,在創(chuàng)建同名空文件的時(shí)候,一定要注意,文件名是否進(jìn)行了加密,如果進(jìn)行了加密,那么創(chuàng)建的文件一定要是加密之后的銘文,不然這里會(huì)出現(xiàn)在跳轉(zhuǎn)到wps的時(shí)候,直接崩潰。


image.png

這行代碼走完之后,你會(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ò):


image.png

經(jīng)過測(cè)試,其實(shí)這個(gè)問題跟不落地沒半毛錢的關(guān)系,使用金山的demo也存在這個(gè)問題。

3,當(dāng)你不落地打開.xslx的時(shí)候,又出現(xiàn)了一個(gè)問題:


image.png

這個(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 。

以上如有問題,可以直接留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容