三方

快速集成金山WPS专业版

2019-07-15  本文已影响3人  码个蛋

最近由于公司的老项目,需要把之前的WPS换成专业版的WPS,所以开始踩坑金山WPS,确实有几个血坑,在此和大家分享一下:
话不多说,先上金山官方链接http://mo.wps.cn/pc-app/office-pro.html
第一步 :打开链接往下滑,选择Android 依次下载下来。

image.png
第一个是官方提供的开发文档,
第二个是使用Demo(兼容eclipse)
第三个是WPS专业版的软件(这个软件是收费的,但是可以试用一个月)
打开Demo可以看到以下目录,这里主要要用到框选中的几个package
image.png
这里大致介绍一下这几个package,
agent:就是提供AIDL通信的,
broad:则是提供一些广播用来监听手机的back,home键和一些加为他的监听
client:则是打开文件之后的一些操作
util:这个就没什么好说的,主要是一些工具类,和常量类

然后我们先把这些package拷贝到自己项目中的一个package中,然后记得把mainface中的文件也一并拷贝过来,这里主要有两个服务和四个广播比较重要

 <!--wps start 注册的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 注册的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通信的,下面这个OfficeServiceClientImpl其实就是一个AIDL中接收器(stub)的实现类,内部初始化了一个非常重要的监听OfficeEventListenerImpl,如果忘记拷贝这个package的话,在后续打开的时候就会出现问题


image.png

这里我们只需要拷贝到自己的项目中就行了,唯一记住的一点就是在OfficeServiceAgentImpl中 有一个成员变量JSON_DATA,这个是实现多应用打开wps的一个功能,wps默认给我提供了一个通信的key,但是这里我们一般使用自己的包名会比较好,这里我直接把文档中的原文粘贴出来


image.png
一定记住这两个地方不能配置错,不然会收不到打开后的回调,也就不能对打开的文件做后续的操作了

这些配置完成之后,再回到demo里面 打开下面这个类


image.png

这个里面有详细的使用规则,这里我就不多说了代码如下

 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);
        }
    }

以上几个方法记住一并拷贝过来,到此为止,就可以正常的打开部分文件了,没错,是部分文件,经过测试,PDF的文件打开会直接崩溃,.PPT文件打开没问题,但是退出会学出现一个wps软件异常的问题。(本人觉得这两个问题是金山自己的问题,因为用他们官方提供的demo一样也存在此类问题)

下面我主要介绍一下什么是不落地打开文件,不落地就是说打开文件的时候,不需要写到SD卡中,直接通过内存中的流或者byte[]来打开,接下来说一下我在使用金山WPS实现不落地打开文件时遇到的坑
首先贴出金山提供的不落地方案:


image.png

这个onOpenFile是在OfficeEventListenerImpl类面的,打开文件后会回调到onOpenFile(String path, OfficeOutputStream output )我们可以通过这两个参数做相应的处理,很明显,我们在调用openFile的时候,必须传给WPS一个path, 那么这里我的方案是,根据文件名,在SD卡下创建一个同名的文件,在onOpenFile()方法里面 根据path删除这个文件,然后把网络中的流或者byte[] 通过一个static的成员变量保存在内存中,在onOpenFile()的时候,通过该方法的第二个参数将bytes写出就完成了不落地方案。
在参照这种模式实现不落地的时候,需要注意几点:
1,在Mainface中注册服务和广播的时候,一定要注意包名写全:


image.png

如果你是简写的,可能会出现回调不回来的问题(本人亲自踩坑)

2,在创建同名空文件的时候,一定要注意,文件名是否进行了加密,如果进行了加密,那么创建的文件一定要是加密之后的铭文,不然这里会出现在跳转到wps的时候,直接崩溃。


image.png

这行代码走完之后,你会在手机上看到“暂不支持查看,请期待后续版本”,看到这里,很容易觉得是wps版本的问题。(这也是WPS的一个坑)

等所有的问题你都解决完了,你会发现.doc不落地打开是没问题的,打开PPT也没问题,但是关闭打开的ppt时,但是关闭了打开的ppt时,又出现了报错:


image.png

经过测试,其实这个问题跟不落地没半毛钱的关系,使用金山的demo也存在这个问题。

3,当你不落地打开.xslx的时候,又出现了一个问题:


image.png

这个问题还算是稍微提示得比较明显,这里需要把文件全部写到本地,然后也不能在onOpenFile里面进行删除操作,需要在broadcast里面做删除操作,个人觉得这里也是比较坑的

4,当你打开.txt文件的时候,不落地打开和本地打开是有区别的,不落地打开有部分内容会被wpsAPP的titlebar遮挡住,需要手动点击一点,才可以看到这个内容效,果如下:
https://s31.aconvert.com/convert/p3r68-cdx67/5p0nw-kwzef.gif

以上如有问题,可以直接留言。

上一篇下一篇

猜你喜欢

热点阅读